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: >>=

有人可以帮助我吗?

  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 写一个实例。

您在声明实例时没有显式地编写类型。但是,如果你真的想这样做,请转 InstanceSigs 扩展名:{-# LANGUAGE InstanceSigs #-}

如另一个答案中所述,Haskell 对缩进敏感,但是您可以将定义放在括号中以绕过它:

instance SomeClass Int where {
x = 3
}