3

我一直在研究“Real World Haskell”,并且一直在研究如何使用 Maybe。我在第 3 章中编写了这种数据类型和相应的函数。本书建议尝试将其转换为使用 Maybe 并摆脱 Nil 类型。我一直在玩这个,但我不知道该怎么做。我试过在不同的地方添加可能,但我真的只是在猜测而不是知道如何去做。

data List a = List a (List a)
            | Nil
            deriving (Show)

toList :: List a -> [a]
toList (List a Nil) = a:[]
toList (List a as)  = a:(toList as)
4

2 回答 2

7

看这个:

data List a              data Maybe a
    = List a (List a)        = Just a
    | Nil                    | Nothing

当你这样写时,并行看起来很清楚——我们只需要在Just旁边放一些额外的数据!要放置“额外”数据,我们可以使用元组。唯一的另一个问题是我们必须命名一个构造函数。

data List' a = List' (Maybe (a, List' a {- here's the extra bit -}))
于 2013-10-09T18:16:16.797 回答
2
data List a = List a (Maybe (List a))

会做的。你必须List 1 (Just (List 2 Nothing))代表[1, 2]。不过,我不知道它是最优雅的还是最容易使用的。

于 2013-10-09T17:05:02.523 回答