从数据类中的List派生长度函数

fly*_*eep 0 generics haskell

我有一个由两个别名组成的数据类:String[String],即[Char][[Char]].目前它派生EqShow:

data BashVar = BashString String | BashArray [String] deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)

为什么它不能从也可以派生出[_]通用列表类型?

我只是希望能够在类的实例上使用列表函数,特别是length.

Nei*_*own 8

列表没有类. length被简单地定义为:

length :: [a] -> Int
Run Code Online (Sandbox Code Playgroud)

不(我认为你想象):

class ListLike l where
  length :: l a -> Int
Run Code Online (Sandbox Code Playgroud)

列表最接近的类可能是Foldable:http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Foldable.html 但这并没有定义length,只是各种折叠.

除此之外,如果有一个列表类,它可能仍然允许内部类型变化,如上面的例子.您的BashVar类不允许列表中的任何类型,它固定为String列表.因此,即使ListLike存在,也无法支持它(并且Foldable由于同样的原因你无法得出).