【发布时间】:2015-01-04 02:39:22
【问题描述】:
我是一个非常新的 Haskell 学习者。我有一个工作表达式:
do x <- try parseA <|> parseB
return x
这似乎工作得很好(我正在使用Parsec 包,但我希望这个问题与其功能无关,据我所知<|> 是Parsec 定义的中缀运算符)。 parseA 和 parseB 都具有 Parser Foo monad 类型,整个表达式也是如此。
根据我目前阅读的内容,这似乎应该等同于
do return (try parseA <|> parseB)
和
do return $ try parseA <|> parseB
但后者都无法编译,它们抱怨类型不匹配(以下错误)。
我的另一次尝试重写这个,为
(try parseA <|> parse B) >>= return
似乎有效。但如果我也误解了这一点,请说出来。
所以我的问题是,有人可以解释为什么前三个不同。我很困惑为什么它们不相等。我错过了什么?
错误(如果这是相关的,虽然我不打算“修复”我的代码 - 我有一个工作版本,我希望了解这些版本的不同之处):
do return (try parseA <|> parseB)
给予
parse.hs:76:11:
Couldn't match expected type ‘Foo’
with actual type ‘Text.Parsec.Prim.ParsecT
[Char] () Data.Functor.Identity.Identity Foo’
和
do return $ try parseA <|> parseB
给予
parse.hs:76:3:
Couldn't match type ‘Text.Parsec.Prim.ParsecT
[Char] () Data.Functor.Identity.Identity Foo’
with ‘Foo’
Expected type: Parser Foo
Actual type: Text.Parsec.Prim.ParsecT
String
()
Data.Functor.Identity.Identity
(Text.Parsec.Prim.ParsecT
[Char] () Data.Functor.Identity.Identity Foo)
【问题讨论】:
标签: haskell