如何将'Real World Haskell'中的列表数据类型转换为使用Maybe?

3

我一直在学习《Real World Haskell》,但是在使用Maybe方面卡住了。我按照第三章的例子写了这个数据类型和相应的函数。书中建议尝试将其转换为使用Maybe并且去除Nil类型。我一直在尝试,但是无法做到。我尝试在不同的位置添加maybe,但只是猜测而不是真正知道如何做。

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)

不记得有这样的练习,但是有一个将“树(Tree)”转换为使用“Maybe”的练习。 - lambdas
是的,你说得对。我想看看我是否也可以为列表示例做同样的事情。 - Michael Barton
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 -}))

谢谢您的回答。方法签名是否仍应为 toList :: (List a) -> [a]? - Michael Barton
@MichaelBarton 我想你想要尝试的练习取决于你自己。这听起来像是一件有趣的事情吗?如果是,我建议你去尝试! - Daniel Wagner
抱歉,只是为了明确一点,如果想修改我上面的函数来使用 maybe 列表,类型签名应该是什么? - Michael Barton
@MichaelBarton 我认为你提出的签名很好。 - Daniel Wagner

2
data List a = List a (Maybe (List a))

如果要表示[1, 2],你可以使用List 1 (Just (List 2 Nothing))。我不确定这是否是最优雅或最易于使用的方法。


1
我想你希望 Maybe 能覆盖更多的内容 - 这种类型没有空列表! - Daniel Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接