作为一个练习,我在Haskell中实现了一个'cons'操作,它从两个任意类型的值构成一对。实施所需的数据类型是很容易的:Haskell中的'cons'与其计划对应部分
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
*Main> cddr (Cons 55 (Cons (1,2,3,4) "hello, world!"))
"hello, world!"
*Main>
但灵感this thread,我想使所产生的对打印出像Scheme列表会 - 包括臭名昭著的“不正当名单”(1 2 3 4)。我的实现(见下文)正在为夏亚:
*Main> Cons 'a' (Cons 'b' (Cons 'c' Nil))
('a' 'b' 'c')
*Main> Cons 'a' (Cons 'b' 'c')
('a' 'b' . 'c')
*Main> Cons (Cons 'a' 'b')(Cons 'c' (Cons 'd' Nil))
(('a' . 'b') 'c' 'd')
这不是诚信部(或任何其它数据类型)的工作这么好。所以我的问题是:我怎样才能使这项工作的其他数据类型?即,我希望它是这样工作的:
*Main> Cons 5 (Cons "hello" (Cons False Nil))
(5 "hello" False)
我目前的全面实施如下:
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
instance Show Nil where show _ = "()"
class ShowPair a where
showRight::a->String
instance (Show a, ShowPair a, ShowPair b)=>Show (Pair a b) where
show (Cons car cdr) = "(" ++ (show car) ++ (showRight cdr) ++ ")"
instance (Show a, ShowPair a, ShowPair b)=>ShowPair (Pair a b) where
showRight (Cons car cdr) = " " ++ (show car) ++ (showRight cdr)
instance ShowPair Char where
showRight x = " . " ++ show x
instance ShowPair Int where
showRight x = " . " ++ show x
instance ShowPair Nil where
showRight _ = ""
Haskell带有一个内置操作,可以从任何类型的两个值形成一对:'(a,b)'。如果你想像使用函数那样使用它,它可以拼写成'(,)a b'。 '()'然后把你的'Nil'的一部分。 'car'拼写'fst','cdr'为'snd'。 – Ben 2012-01-31 23:37:04
@Ben了解 - 我知道我很可能在这里做了一些轮子改造。有什么办法可以让用(,)生成的配对像计划列表一样打印出来? – gcbenison 2012-02-01 03:44:10