【发布时间】:2023-03-12 15:27:02
【问题描述】:
此问题基于 Graham Hutton 第二版“Haskell 编程”一书“声明类型和类”一章中的示例.
数据声明为:
data List a = Nil | Cons a (List a)
使用此声明的示例函数是:
len :: List a -> Int
len Nil = 0
len (Cons _ xs) = 1 + len xs
但是无论我怎么尝试,我似乎都无法使用len的功能:
len Cons 1 Cons 2 Cons 3len 1len Conslen (1)len [1,2]len Cons [1]len (1,2)len Cons (1,2)len Cons 1 2len (Cons (1,2))len (Cons 1 2)
我错过了len 和Cons 的任何排列吗?还是这个例子根本行不通?
【问题讨论】:
-
首先尝试实现
foo :: List Int类型的表达式可能更简单。列表是递归数据类型,所以起初看如何“完成”递归可能有点棘手。但是有一种方法可以构建一个不涉及使用另一个列表的列表。 -
@AsadSaeeduddin:谢谢,我终于可以和
len (Cons 2 (Cons 2 Nil))一起工作了。看起来 Haskell 自我声明的函数通常会导致相当长的术语。 -
你可以声明一个中缀构造函数。它必须以
:开头。例如。:.。使用适当的固定性声明,您可以拥有len $ 1 :. 2 :. 3 :. Nil。
标签: list haskell types syntax custom-data-type