gpt4 book ai didi

parsing - 程序错误: undefined member: >>= Haskell

转载 作者:行者123 更新时间:2023-12-02 14:31:26 24 4
gpt4 key购买 nike

我正在 Haskell 中实现一个简单的解释器,但我遇到了这个问题。代码是这样的:

import Control.Applicative
import Data.Char

newtype Parser a = P (String -> [(a,String)])

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

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

instance Functor Parser where
fmap :: (a -> b) -> Parser a -> Parser b
fmap g p = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> [(g v, out)])

instance Monad Parser where
(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= f = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> parse (f v) out)

three :: Parser (Char,Char)
three = do {x <- item;
item;
z <- item;
return (x,z);}

如果我在拥抱中运行脚本,一切似乎都没问题。但是当我尝试运行命令时

parse three "abcdef"

我收到错误:

Program error: undefined member: >>=

请问有人可以帮助我吗?

最佳答案

  1. 不要为实例提供类型签名。

  2. 缩进实例定义。

完成这两件事后,您将看到一个新错误,您需要定义一个 Applicative 实例,因为 class Applicative m => Monad m

编辑:

你写道:

instance Monad Parser where
(>>=) :: Parser a -> (a -> Parser b) -> Parser b -- This is a type signature
p >>= f = P (\inp -> case parse p inp of -- This is the definition
[] -> []
[(v,out)] -> parse (f v) out)

第一个问题是类型签名,我通过上面的评论注意到了这一点。删除它:

instance Monad Parser where
p >>= f = P (\inp -> case parse p inp of -- This is the definition
[] -> []
[(v,out)] -> parse (f v) out)

第二个问题是缩进。您必须缩进成员函数定义(或使用花括号,但这是一种不常见的样式):

instance Monad Parser where
p >>= f = P (\inp -> case parse p inp of
[] -> []
[(v,out)] -> parse (f v) out)

现在您收到一个新错误,指出您需要一个应用实例。所以你需要:

instance Applicative Parser where
pure = ...
(<*>) = ...

甚至在那之后它会告诉你为 Functor 编写一个实例。

关于parsing - 程序错误: undefined member: >>= Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745446/

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