我目前正在阅读《Kan Extensions for Program Optimisation》这本书,作者在论文的第一页中定义了给定M为一个单子的以下单子。
所以我尝试着用M=Maybe来玩一下,于是写了以下代码。
但是它无法编译并输出
Main.hs:22:10: 错误: • 类型同义词‘C’应该有1个参数,但没有给出任何参数
我无法解释这个错误。出了什么问题? (我学过一些范畴论,但刚开始学习Haskell)。
type C a = ∀z . (a → M z ) → M z
instance Monad C where
return a = λc → c a
m >>= k = λc → m (λa → k a c)
所以我尝试着用M=Maybe来玩一下,于是写了以下代码。
type C a = forall z . (a -> Maybe z) -> Maybe z
instance Monad C where
return a = \c -> c a
m >>= k = \c -> m $ \a -> k a c
但是它无法编译并输出
Main.hs:22:10: 错误: • 类型同义词‘C’应该有1个参数,但没有给出任何参数
我无法解释这个错误。出了什么问题? (我学过一些范畴论,但刚开始学习Haskell)。
newtype
代替。 - Fyodor Soikintype
替换为newtype
。newtype
更类似于data
而不是type
;你需要在右侧定义它的构造函数,而不仅仅写一个类型表达式。 - Bentype
和newtype
之间的差异等问题,只需将想法写下来。这个示例是伪Haskell代码(lambda函数是一个明显的线索;UnicodeSyntax
可以提供漂亮的箭头,但不包括λ
)。如果你想编译类似的东西,你需要先将其翻译成实际的Haskell代码。我谦卑地建议,“我刚开始学Haskell”并不是将研究论文中的思想转化为可工作代码的合适经验水平。 - BenFunctor
和Monad
)时出现不可靠的类型推断(以及更糟糕的错误信息)。 - Jon Purdy