【问题标题】:List syntax with custom list type具有自定义列表类型的列表语法
【发布时间】:2013-05-31 07:48:39
【问题描述】:

给定一个自定义类型的列表,例如

data List' a = EmptyList | NonEmptyList a (List' a)
           deriving Show

以及一个判断此类列表是否为非空的函数

null' xs = case xs of
  EmptyList -> True
  _ -> False

为什么不在 GHCi 中使用类似列表参数调用它

null' NonEmptyList [1,2,3] 

null' EmptyList []

工作?调用定义了构造函数的函数确实有效。

null' Emptylist

这是为什么?

【问题讨论】:

  • 您希望在这里发生什么?你给null' 两个参数。 null' 接受一个参数并返回一个列表。
  • for null' function yes, but for append' 正如你所见,我希望它能给我一个附加列表。
  • 此外,您似乎正在将内置语法(即带有方括号的内容)与您自己的列表混合在一起。你可以写NonEmptyList 1 (NonEmptyList 2 (NonEmptyList 3 EmptyList))) 来制作你自己的列表。不涉及方括号。
  • 我不关注... 你应该准确说明: * 你在做什么; * 你期望什么(也许是为什么); * 发生了什么。
  • IOW 从实现fromList :: [a] -> List' a 开始,也许还可以实现toList :: List' a -> [a]

标签: haskell functional-programming pattern-matching recursive-datastructures


【解决方案1】:

就像 shachaf 提到的那样,您的列表类型与 Prelude 中提供的 Haskell 的列表类型不同。这意味着您不能对自定义列表类型使用列表括号语法,除非您使用 OverloadedLists 语言扩展名,您可以阅读有关 here 的更多信息。

但是,让我们暂时假设您没有重载列表语法。那么调用 null' 函数的唯一方法是使用您定义的构造函数:

>>> null' EmptyList
True
>>> null' (NonEmptyList 1 (NonEmptyList 2 EmptyList))
False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多