我正在尝试为Haskell中的固定长度列表定义一个类型.当我使用标准方式将自然数编码为一元中的类型时,一切正常.但是,当我尝试在GHC的类型文字上构建所有内容时,我遇到了大量问题.
我对所需列表类型的第一次拍摄是
data List (n :: Nat) a where
Nil :: List 0 a
(:>) :: a -> List n a -> List (n+1) a
Run Code Online (Sandbox Code Playgroud)
遗憾的是,它不允许使用类型编写zip函数
zip :: List n a -> List n b -> List n (a,b)
Run Code Online (Sandbox Code Playgroud)
我可以通过从类型变量n中的类型变量中减去1来解决这个问题(:>):
data List (n :: Nat) a where
Nil :: List 0 a
(:>) :: a -> List (n-1) a -> List n a -- subtracted 1 from both n's
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试定义一个追加函数:
append :: List n1 a -> …Run Code Online (Sandbox Code Playgroud) 我承认这个问题有点不明确,但我想知道为什么我从来没有偶然发现Haskell中的仿函数上的monoids类型类.我是否错过了它,是否有充分的理由要求这种缺席,还是完全归因于历史原因?恕我直言,下面的继承图表看起来有点奇怪没有右上角:
Functor
|
V
Applicative ––> Alternative
| |
V V
Monad ––> MonadPlus
Run Code Online (Sandbox Code Playgroud)