Program error: undefined member: >>= Haskell
Program error: undefined member: >>= Haskell
我正在 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);}
如果我 运行 hugs 中的脚本似乎一切正常。但是当我尝试 运行 命令时
parse three "abcdef"
我收到一个错误:
Program error: undefined member: >>=
有人可以帮助我吗?
不要给实例类型签名。
缩进实例定义。
在这两件事之后你会看到一个新的错误,你需要定义一个 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 写一个实例。
您在声明实例时没有显式地编写类型。但是,如果你真的想这样做,请转 InstanceSigs
扩展名:{-# LANGUAGE InstanceSigs #-}
如另一个答案中所述,Haskell 对缩进敏感,但是您可以将定义放在括号中以绕过它:
instance SomeClass Int where {
x = 3
}
我正在 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);}
如果我 运行 hugs 中的脚本似乎一切正常。但是当我尝试 运行 命令时
parse three "abcdef"
我收到一个错误:
Program error: undefined member: >>=
有人可以帮助我吗?
不要给实例类型签名。
缩进实例定义。
在这两件事之后你会看到一个新的错误,你需要定义一个 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 写一个实例。
您在声明实例时没有显式地编写类型。但是,如果你真的想这样做,请转 InstanceSigs
扩展名:{-# LANGUAGE InstanceSigs #-}
如另一个答案中所述,Haskell 对缩进敏感,但是您可以将定义放在括号中以绕过它:
instance SomeClass Int where {
x = 3
}