gpt4 book ai didi

Haskell 类型错误

转载 作者:行者123 更新时间:2023-12-03 04:28:38 26 4
gpt4 key购买 nike

考虑以下 Haskell 代码:

 type Parser a = String -> [(a, String)]

item :: Parser Char
item = \ inp -> case inp of
[] -> []
(x:xs) -> [(x, xs)]

ret :: a -> Parser a
ret v = \ inp -> [(v, inp)]

parse :: Parser a -> String -> [(a, String)]
parse p inp = p inp

pseq :: Parser (Char, Char)
pseq = do x <- item
item
y <- item
ret (x, y)

ac = parse pseq "abcdef"

当尝试在 Hugs 中运行上述代码(2006 年 9 月版本)时,我收到以下错误消息:

Type error in explicitly typed binding
*** Term : pseq
*** Type : [Char] -> [(([(Char,[Char])],[(Char,[Char])]),[Char])]
*** Does not match : Parser (Char,Char)

并且,当我删除“pseq”的类型声明时,我收到以下错误消息:

Unresolved top-level overloading
*** Binding : pseq
*** Outstanding context : Monad ((->) [Char])

最佳答案

问题是您尝试对 Parser 使用 do 表示法,但它并不完全是 Monad。确实如此,因为 r -> 有一个 Monad 实例,但这使得类型位于 -> 的右侧> Monad 的“元素”类型,这里您希望元素类型为 [(a,String)] 中的 a 。您需要将 Parser 定义为 newtype,并为其编写一个自定义 Monad 实例(或者用现有的 monads/transformers 组合它)例如 ListTStateT)。

关于Haskell 类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com