Haskell 如何隐藏';现实世界的哈斯克尔';列出要使用的数据类型?

Haskell 如何隐藏';现实世界的哈斯克尔';列出要使用的数据类型?,haskell,maybe,Haskell,Maybe,我一直在学习“真实世界的哈斯克尔”,我一直在研究如何使用它。我在第3章中编写了这个数据类型和相应的函数。这本书建议尝试将其转换为使用Maybe并去掉Nil类型。我一直在玩这个,但我不知道怎么做。我尝试过在不同的地方添加,但我只是猜测,而不是知道如何添加 data List a = List a (List a) | Nil deriving (Show) toList :: List a -> [a] toList (List a Nil)

我一直在学习“真实世界的哈斯克尔”,我一直在研究如何使用它。我在第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)
我会的。您将使用
列表1(只是(列表2无任何内容))
来表示
[1,2]
。不过,我不知道它是最优雅还是最容易使用。

看看这个:

data List a              data Maybe a
    = List a (List a)        = Just a
    | Nil                    | Nothing
当你这样写的时候,并行性看起来非常清晰——我们只需要在
这一方添加一些额外的数据!为了放入“额外”数据,我们可以使用元组。唯一的另一个问题是我们必须命名一个构造函数

data List' a = List' (Maybe (a, List' a {- here's the extra bit -}))

我记不起这样的练习了,但是有一个练习可以将
转换为
可能
。是的,你说得对。我想看看我是否也能为列表示例做同样的事情。我想你希望
可能
涵盖更多内容——这种类型没有空列表!谢谢你的回答。方法签名是否仍应为toList::(列表a)->[a]?@MichaelBarton我想你想要解决的练习基本上取决于你自己。这听起来像是一件有趣的事情吗?如果是这样,我说去做吧!抱歉,我想澄清一下,如果我想修改我上面的函数来使用maybe列表,那么签名的类型应该是什么?@MichaelBarton我认为你建议的签名是可以的。
data List' a = List' (Maybe (a, List' a {- here's the extra bit -}))