【问题标题】:How to covert the 'Real World Haskell' list data type to using Maybe?如何将“Real World Haskell”列表数据类型转换为使用 Maybe?
【发布时间】:2013-10-09 17:02:12
【问题描述】:

我一直在研究“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)

【问题讨论】:

  • 不记得这样的练习,但是有一个练习可以将Tree转换为Maybe。
  • 是的,你是对的。我想看看我是否也可以对列表示例做同样的事情。

标签: haskell maybe


【解决方案1】:

看看这个:

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] ?
  • @MichaelBarton 我想你想要解决什么练习几乎取决于你。尝试写这听起来像是一件有趣的事情吗?如果是这样,我说去吧!
  • 抱歉,为了清楚起见,如果想修改我上面的函数以使用可能列表,类型签名应该是什么?
  • @MichaelBarton 我认为你提出的签名很好。
【解决方案2】:
data List a = List a (Maybe (List a))

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

【讨论】:

  • 我认为您希望Maybe 涵盖更多内容——这种类型没有空列表!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多