当前位置:  开发笔记 > 编程语言 > 正文

为什么我从"Haskell中的函数编程"一书中复制的haskell代码无法成功解释?

如何解决《为什么我从"Haskell中的函数编程"一书中复制的haskell代码无法成功解释?》经验,为你挑选了1个好方法。

代码如下:

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

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

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

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

--problem code
p :: Parser (Char, Char)
p = do x <- item
       item
       y <- item
       retrn (x, y)

它给出以下类型错误:

SO-34035520.hs:19:8:
    Couldn't match type `[(Char, String)]' with `Char'
    Expected type: String -> [((Char, Char), String)]
      Actual type: Parser ([(Char, String)], [(Char, String)])
    In a stmt of a 'do' block: retrn (x, y)
    In the expression:
      do { x <- item;
           item;
           y <- item;
           retrn (x, y) }

值得注意的是,本书官方网站上的示例代码可以顺利解释,即*.lhs格式.

那么,有人可以告诉我为什么吗?几天来我一直在努力奋斗.

提前致谢.



1> Cactus..:

(->) String有一个Monad实例,但它不是你想要的.do在定义中使用-notation时p,此实例是拾取的实例.

你想要做的是创建自己的Monad实例Parser(这需要将它从类型同义词更改为newtype包装器String -> [(a, String)]),然后在定义中选择它p.

请注意,您的示例代码已经具有return(在其名称下retrn)执行正确的实现,并且它与returnfor (->) String(它将是)的实现非常不同retrn v = \inp -> v.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有