我知道如何定义类型类,在阅读RawMonad
,RawMonadZero
,RawApplicative
等定义后,我实现了一些简单的类型实例:
data Parser (A : Set) : Set where
MkParser : (String → List (A × String)) → Parser A
ParserMonad : RawMonad Parser
ParserMonad = record {
return = λ a → MkParser λ s → < a , s > ∷ []
; _>>=_ = λ p f → MkParser $ concatMap (tuple $ parse ∘ f) ∘ parse p
}
但是当我尝试在ParserMonad.return
的实施中使用ParserApplicative
时,我失败了:
ParserApplicative : RawApplicative Parser
ParserApplicative = record {
pure = ParserMonad.return -- compile error
; _⊛_ = ...
}
我的问题是:如何使用ParserMonad.return
来实施ParserApplicative.pure
?我该怎么做?或者我应该读什么文件?
答案 0 :(得分:1)
这里你没有使用实例参数,你正在使用记录。 Instance arguments是一个独立的机制,结合记录,可以用来模拟类型类之类的东西。
回到记录,要使用f
类型的记录r
的字段R
,您可以执行各种操作:
R.f
的投影r
: a = R.f r
M
内容对应的模块r
命名为R
,并在其中使用定义f
:module M = R r
a = M.f
f
:open module R r
a = f
使用第一种选择,在你的情况下,它会给我们:
ParserApplicative : RawApplicative Parser
ParserApplicative = record {
pure = RawMonad.return ParserMonad
(...)
}