【发布时间】:2013-04-09 00:21:54
【问题描述】:
在The Little Schemer中有一个函数可以检查列表是否平坦:
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
我正在尝试在 Haskell 中编写相同的递归函数,但没有成功:
is_lat :: [a] -> Bool
is_lat [] = True
is_lat ???
如何检查参数不是[[a]] 的形式?换句话说,[1,2,3] 是有效输入,但 [[1,3], [2,4]] 和 [[[1,2,3]]] 不是。
我想在接受列表的递归函数中进一步使用它,以确保我只处理平面列表。
编辑:我看到人们因为is_lat :: [a] -> Bool 类型签名而感到困惑。我现在同意,我不应该在运行时检查类型。但是,是否可以在编译时检查类型?如何使该功能仅适用于 flat 列表?还是我应该彻底改变我的思维方式?
【问题讨论】:
-
问题是:你为什么要这个?你打算如何使用这个功能?
-
如果它是一个列表,你能不能只检查每个元素?
-
如果
[[[1, 2, 3]]]不是有效输入,则您的函数类型错误,您可能需要重新考虑您要完成的工作。 -
列表平坦是什么意思?在 Haskell 中,所有列表必须具有相同类型的元素。
-
为什么它只适用于平面列表?如果您需要某些元素,将其限制为固定类型(如
[Int] -> Bool或类型类Num a => [a] -> Bool)可能是有意义的,但如果它适用于任何元素类型,为什么元素类型不能是列表?
标签: list haskell recursion pattern-matching the-little-schemer