`empty',`<|>' : 不是 `Alternative' 类的(可见)方法

mas*_*cIT 2 haskell

我正在尝试用 Haskell 编写一个解析器,但我对它的替代定义有问题(Functor、Applicative 和 Monad 已完成并正在工作):

instance Alternative Parser where
empty = P (\env input -> [])
p <|> q = P (\env input -> case parse p env input of 
                [] -> parse q env input 
                [(env, v, out)]-> [(env, v, out)])
Run Code Online (Sandbox Code Playgroud)

一旦我使用 Stack (stack build; stack run;) 编译,我就会收到这些错误,包括空运算符和 <|> 运算符:

`empty' is not a (visible) method of class `Alternative'
`<|>' is not a (visible) method of class `Alternative'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Apl*_*123 5

您需要导入empty<|>实现它们:

import Control.Applicative (Alternative, empty, (<|>))
Run Code Online (Sandbox Code Playgroud)

或者,也可以通过导入Control.Applicative合格来避免将它们纳入范围:

import Control.Applicative (Alternative)
import qualified Control.Applicative
Run Code Online (Sandbox Code Playgroud)

  • 导入类型类时,通常将成员与类名分组,或者使用通配符导入(如“Alternative(..)”),或者显式列出名称(如“Alternative((&lt;|&gt;),empty)”)。当导入一个合格的模块时,通常会引入一个别名,通常基于名称的最后组成部分(例如“导入合格的 Control.Applicative as Applicative;导入合格的 Data.Text as Text”)或缩写助记符(“import合格的 Data.Foldable 为 F;导入合格的 Data.ByteString.Lazy 为 BL`)。 (2认同)