相关疑难解决方法(0)

固定长度和类型文字的列表

我正在尝试为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 type-inference ghc

9
推荐指数
2
解决办法
747
查看次数

比较固定大小的矢量

我正在尝试写一个固定大小的矢量,如下所示:

{-# LANGUAGE GADTs, DataKinds, KindSignatures, TypeOperators #-}
import GHC.TypeLits

data NVector (n :: Nat) a where
    Nil :: NVector 0 a
    Cons :: a -> NVector n a -> NVector (n + 1) a

instance Eq a => Eq (NVector n a) where
    Nil == Nil = True
    (Cons x xs) == (Cons y ys) = x == y && xs == ys
Run Code Online (Sandbox Code Playgroud)

但它无法使用此消息进行编译:

 Could not deduce (n2 ~ n1)
from the context (Eq a)
  bound by the instance …
Run Code Online (Sandbox Code Playgroud)

haskell

3
推荐指数
1
解决办法
166
查看次数

标签 统计

haskell ×2

ghc ×1

type-inference ×1