Haskell是一种函数式编程语言,具有强大的静态类型,惰性求值,广泛的并行性和并发支持以及独特的抽象功能。
在我的代码中, zipWith7 运行良好,但现在 zipWith7 中的函数需要额外的 arity 。 zipWith8 ( b c d e f g h-> ....) 列表-A ... 列表-H 而 Haskell 基础库仅支持最多 7 个数量
我是 Haskell 新手。这是我的解析器: 数据解析器 a = MkParser (String -> Maybe a) 这会解析任何字符串,给出第一个字符: -- 任意字符 anyChar :: 解析器 Char anyChar = MkParser sf
有没有办法在 Haskell 的类型签名中表达“任何类型的函数”?
我的新手尝试表达操作符||的行为来自 Haskell 中的 C/C++: orElse :: Bool -> (a -> Bool) -> (a -> Bool) 否则 True _ = const True 否则 False pred = pred 可以吗...
这样设置 zipWithPadding 我会失去什么? (Haskell 中的备用 zipWith)
当我尝试遍历不同长度的列表并且我不希望它们被最短的列表剪切时,出现了这个问题。在列表中有我想要的整数的上下文中...
我想创建一个对多种数据类型执行操作的Haskell 类。例如,我想在 Map 结构的所有元素上添加一个值并检索一个新的 Map。 要做...
编译以下 Yesod / Haskell 代码( Main.hs )时 数据应用=应用 mkYesod“应用程序”[parseRoutes| /from/php/to/dhscanner/ast FromPhpR POST /from/py/to/dhscanner/ast 来自PyR POST /...
我正在学习 Haskell,我遇到了这个与列表推导相关的示例: [x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs] The answer given is: [4,2]. Why isn't the answer [(3,4...
《Haskell 中的并行和并发编程》书中 `waitEither` 实现中的潜在死锁
我们在《Haskell 中的并行与并发编程》第 8 章中给出了以下 API 接口, 数据 Async a = Async (MVar (Either SomeException a)) 异步 :: IO a ->...
假设我有数据类型: 数据 T a 其中 T :: 可强制 a b => U b -> T a toU :: T a -> U a toU (T x) = 强制 x GHC 是否在运行时删除了 Coercible 约束以产生: d...
Haskell 的类型系统是 Curry 风格还是 Church 风格?
Haskell 的类型系统是 Curry 风格还是 Church 风格? 在研究 Haskell 的类型系统时,我遇到了 Curry 风格和 Church 风格这两个术语。我想了解之间的区别
为什么我在命令“cabal init <projectname>”时收到错误“cabal:'init'不接受任何额外参数”
我已经在 Debian 12 上安装了 GHC 9.0.1,并且“cabal --version”产生: $ cabal --版本 cabal 安装版本 3.6.2.0 使用 Cabal 库 3.6.3.0 版本编译 我已经开始了
我知道Eq类的定律包括反射性、对称性和传递性。 对于相等不一定具有传递性的情况,是否还有另一类? 我可以自己写一个(...
我尝试学习 Haskell,并努力将 do 语法转换为 monad。 所以,我把它归结为一个小例子。 我懂了: 工作::字符串 工作=做 让 arr = ["获取", "这个&qu...
在 Kubernetes 中运行 Haskell 应用程序时没有 stdout/stderror 输出或延迟
我遇到了一个非常奇怪的问题,当通过 Kubernetes 运行时,我似乎没有从 Haskell 应用程序获得任何 stdout/stderr 输出。 我正在使用非常基本的 putStrLn 写入标准输出。 ...
我正在尝试用 Haskell 进行我的第一次(在我看来)不平凡的尝试。我可能会问有关每个部分的问题,以比较我与 c-like 的长期关系
当我在沙箱项目中运行 cabal install 时,我得到 /usr/bin/ld:找不到-lHSzlib-0.6.1.2-GcLmGV5PElZD6CJvjR9umm /usr/bin/ld:找不到-lHSasync-2.1.1.1-2GwQEYzLBsdIBCHbNA3HGy /usr/bin/ld:
考虑 Haskell 代码: 做——这是IO! ... !x <- someFunction ... usage of x how useful is ! here? It's a result of monadic (it's IO !) evaluation, so my questions are: if x is a
如何在 Haskell 中编写 Monad 来高效地跟踪和预取 i18n 键?
我正在尝试编写一个 Monad 来跟踪一段代码正在使用哪些 i18n 键。这个想法是预先以有效的方式预取所有这些键的值,而不是最终...
我正在尝试从定期提供 XML 文件和股票市场报价(示例数据)的网页获取数据。 XML 的结构非常简单,如下所示: 我正在尝试从定期提供带有股票市场报价的 XML 文件的网页获取数据(示例数据)。 XML 的结构非常简单,如下所示: <?xml version="1.0"?> <Contents> <StockQuote Symbol="PETR3" Date="21-12-2010" Time="13:20" Price="23.02" /> </Contents> (不仅如此,但这足以作为一个例子)。 我想将其解析为数据结构: data Quote = Quote { symbol :: String, date :: Data.Time.Calendar.Day, time :: Data.Time.LocalTime.TimeOfDay, price :: Float} 我或多或少了解 Parsec 的工作原理(在 Real World Haskell 书的水平上),并且我尝试了一些 Text.XML 库,但我所能开发的只是一个可以工作的代码,但对于这样一个简单的任务来说太大了看起来像是一个半生不熟的黑客,而不是最好的黑客。 我对解析器和XML了解不多(我基本上知道我在RWH书中读到的内容,我以前从未使用过解析器)(我只是做统计和数值编程,我不是计算机科学家)。是否有一个 XML 解析库,我可以在其中知道模型是什么并立即提取信息,而无需手动解析每个元素,也无需解析纯字符串? 我在想这样的事情: myParser = do cont <- openXMLElem "Contents" quote <- openXMLElem "StockQuote" symb <- getXMLElemField "Symbol" date <- getXMLElemField "Date" (...) closequote <- closeXMLElem "StockQuote" closecont <- closeXMLElem "Contents" return (symb, date) results = parse myParser "" myXMLString 我不必处理纯字符串并自己创建组合器(我很讨厌它)。 编辑:我可能需要阅读一些有关一般解析器(不仅仅是 Parsec)的内容(足以以正确的方式完成此操作)以及有关 XML 的最少内容。你们有推荐什么吗? 我必须解析的真正字符串是这样的: stringTest = "<?xml version=\"1.0\"?>\r\n<ComportamentoPapeis><Papel Codigo=\"PETR3\" Nome=\"PETROBRAS ON\" Ibovespa=\"#\" Data=\"05/01/201100:00:00\" Abertura=\"29,80\" Minimo=\"30,31\" Maximo=\"30,67\" Medio=\"30,36\" Ultimo=\"30,45\" Oscilacao=\"1,89\" Minino=\"29,71\"/></ComportamentoPapeis>\r\n" 编辑2: 我尝试了以下方法(readFloat、readQuoteTime 等只是从字符串中读取内容的函数)。 bvspaParser :: (ArrowXml a) => a XmlTree Quote bvspaParser = hasName "ComportamentoPapeis" /> hasName "Papel" >>> proc x -> do (hour,date) <- readQuoteTime ^<< getAttrValue "Data" -< x quoteCode <- getAttrValue "Codigo" -< x openPrice <- readFloat ^<< getAttrValue "Abertura" -< x minim <- readFloat ^<< getAttrValue "Minimo" -< x maxim <- readFloat ^<< getAttrValue "Maximo" -< x ultimo <- readFloat ^<< getAttrValue "Ultimo" -< x returnA -< Quote quoteCode (LocalTime date hour) openPrice minim maxim ultimo docParser :: String -> IO [Quote] docParser str = runX $ readString [] str >>> (parseXmlDocument False) >>> bvspaParser 当我在 ghci 中调用它时: *Main> docParser stringTest >>= print [] 有什么问题吗? 有很多为 Haskell 编写的 XML 库可以为您进行解析。我推荐名为 xml 的库(请参阅 http://hackage.haskell.org/package/xml)。有了它,您可以简单地写例如: let contents = parseXML source quotes = concatMap (findElements $ unqual "StockQuote") (onlyElems contents) symbols = map (findAttr $ unqual "Symbol") quotes print symbols 此代码片段打印 [Just "PETR3"] 作为示例 XML 的结果,并且可以轻松扩展以收集您需要的所有数据。要以您描述的风格编写程序,您应该使用 Maybe monad,因为 xml 查找函数通常返回 Maybe 字符串,表明是否可以找到标签、元素或属性。另请参阅相关问题:使用哪个 Haskell XML 库? 对于简单的xml解析,使用tagoup不会出错。 http://hackage.haskell.org/package/tagsoup 以下代码片段使用 xml-enumerator。它将日期和时间保留为文本(解析这些内容作为读者的练习): {-# LANGUAGE OverloadedStrings #-} import Text.XML.Enumerator.Parse import Data.Text.Lazy (Text, unpack) data Quote = Quote { symbol :: Text , date :: Text , time :: Text , price :: Float} deriving Show main = parseFile_ "test.xml" (const Nothing) $ parseContents parseContents = force "Missing Contents" $ tag'' "Contents" parseStockQuote parseStockQuote = force "Missing StockQuote" $ flip (tag' "StockQuote") return $ do s <- requireAttr "Symbol" d <- requireAttr "Date" t <- requireAttr "Time" p <- requireAttr "Price" return $ Quote s d t (read $ unpack p) 我过去使用过 Haskell XML Toolbox。 类似于的东西 {-# LANGUAGE Arrows #-} quoteParser :: (ArrowXml a) => a XmlTree Quote quoteParser = hasName "Contents" /> hasName "StockQuote" >>> proc x -> do symbol <- getAttrValue "Symbol" -< x date <- readTime defaultTimeLocale "%d-%m-%Y" ^<< getAttrValue "Date" -< x time <- readTime defaultTimeLocale "%H:%M" ^<< getAttrValue "Time" -< x price <- read ^<< getAttrValue "Price" -< x returnA -< Quote symbol date time price parseQuoteDocument :: String -> IO (Maybe Quote) parseQuoteDocument xml = liftM listToMaybe . runX . single $ readString [] xml >>> getChildren >>> quoteParser 还有其他方法可以使用这个库,但是对于像这样简单的事情,我组合了一个 sax 解析器。 import Prelude as P import Text.XML.Expat.SAX import Data.ByteString.Lazy as L parsexml txt = parse defaultParseOptions txt :: [SAXEvent String String] main = do xml <- L.readFile "stockinfo.xml" return $ P.filter stockquoteelement (parsexml xml) where stockquoteelement (StartElement "StockQuote" attrs) = True stockquoteelement _ = False 从那里你可以弄清楚要去哪里。 您还可以使用 Text.XML.Expat.Annotated 将其解析为更像您在上面寻找的结构: parsexml txt = parse defaultParseOptions txt :: (LNode String String, Maybe XMLParseError) 然后使用Text.XML.Expat.Proc浏览结构。
为什么 Haskell 不允许更复杂的中缀表达式,例如。 xs `zipWith (+)` ys l `f 0 0` r 它似乎至少从 2007 年就开始流通了。 此页面表明这是因为出现问题