Haskell 从另一个模块导入一元数据

Haskell 从另一个模块导入一元数据,haskell,Haskell,我有以下模块结构: 单元A: 模块a其中 新类型解析器p=p(字符串->可能(p,字符串)) parse::Parser p->String->Maybe(p,String) 解析(P)=P 项::解析器字符 item=P(\inp->case inp of []->什么都没有 (x:xs)->只是(x,xs)) 模块B: 模块B,其中 ... 实例替代解析器,其中 空=P(\inp->Nothing) (P a)(P b)=P(\inp->案例a的inp 无->b inp Just(x,v)

我有以下模块结构:

单元A:

模块a其中
新类型解析器p=p(字符串->可能(p,字符串))
parse::Parser p->String->Maybe(p,String)
解析(P)=P
项::解析器字符
item=P(\inp->case inp of
[]->什么都没有
(x:xs)->只是(x,xs))
模块B:

模块B,其中
...
实例替代解析器,其中
空=P(\inp->Nothing)
(P a)(P b)=P(\inp->案例a的inp
无->b inp
Just(x,v)->Just(x,v)
)
模块C:


模块ModuleC在哪里
导入模块a
导入模块B
导入数据.Char
conditionalParser::(Char->Bool)->解析器Char
条件parser f=do

x您正从
ModuleB
导入实例定义,一切正常。您没有导入的是类定义,声明
empty
方法的是类,而不是实例

将此添加到模块C的顶部

import Control.Applicative
应该这样做

或者,您也可以从
ModuleB
重新导出
Applicative


还要注意的是,通常认为在一个与类型和类分离的模块中定义实例是不合理的。如果选择正确的实例,这可能会导致微妙的意外结果。这被称为“孤立实例”,甚至有编译器反对它