用户定义的List实例

lbo*_*lla 2 haskell types class

这应该是非常简单的,但我似乎无法解决它.

假设我有我自己的List类,声明headtail在其接口.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)


Dan*_*her 7

您可以

我认为构造函数类是最好的方法.