lbo*_*lla 2 haskell types class
这应该是非常简单的,但我似乎无法解决它.
假设我有我自己的List类,声明head并tail在其接口.List应该是你所期望的,这是一个同类物品的集合.然后,我想创建一个data实现List接口的类型.
以下代码是我提出的,但它不起作用:你将如何解决它?
class List l where
head :: l -> a -- ERROR! How do I tell: given a list, return an element?
tail :: l -> l
data ConsList a = Nil | Cons a (ConsList a)
instance List (ConsList Int) where
head Nil = error "Empty List"
head (Cons h _) = h
tail Nil = error "Empty List"
tail (Cons _ t) = t
Run Code Online (Sandbox Code Playgroud)
提前致谢!
Ste*_*ans 12
而不是定义List类型类,将其定义为构造函数类:
class List l where
head :: l a -> a
tail :: l a -> l a
data ConsList a = Nil | Cons a (ConsList a)
instance List ConsList where
head Nil = error "Empty List"
head (Cons h _) = h
tail Nil = error "Empty List"
tail (Cons _ t) = t
Run Code Online (Sandbox Code Playgroud)
或者,修复元素类型(注意:对于您的类型ConsList,这需要灵活的实例):
{-# LANGUAGE FlexibleInstances #-}
class List l where
head :: l -> Int
tail :: l -> l
data ConsList a = Nil | Cons a (ConsList a)
instance List (ConsList Int) where
head Nil = error "Empty List"
head (Cons h _) = h
tail Nil = error "Empty List"
tail (Cons _ t) = t
Run Code Online (Sandbox Code Playgroud)
最后,对于类型系列,你可以做更多花哨的东西,但它真的取决于你的特定场景,如果你应该去那么远(可能不是):
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
class List l where
type Elt l
head :: l -> Elt l
tail :: l -> l
data ConsList a = Nil | Cons a (ConsList a)
instance List (ConsList Int) where
type Elt (ConsList Int) = Int
head Nil = error "Empty List"
head (Cons h _) = h
tail Nil = error "Empty List"
tail (Cons _ t) = t
Run Code Online (Sandbox Code Playgroud)
您可以
使它成为一个构造函数类,
class List l where
head :: l a -> a
tail :: l a -> l a
Run Code Online (Sandbox Code Playgroud)使它成为具有函数依赖性的多参数类型类
class List l a | l -> a where
head :: l -> a
tail :: l -> l
Run Code Online (Sandbox Code Playgroud)使用类型系列
class List l where
type Elem l
head :: l -> Elem l
tail :: l -> l
Run Code Online (Sandbox Code Playgroud)我认为构造函数类是最好的方法.