我不理解冒号在以下lambda表达式中的作用:
myFunction :: [Int] -> [Int]
myFunction li = foldr (\x acc -> if x < 10 then x : acc else acc) [last li] li
我习惯于看到冒号进行递归操作,但看起来这个冒号实际上是在对当前的累加器列表说 prepend ,是吗?
答案 0 :(得分:7)
:
是一个数据构造函数。它将类型a
的值预先添加到类型[a]
的现有(可能为空)列表中。
let x = 1 : [2,3,4] -- x == [1,2,3,4]
您可以将列表类型构造函数描述为如下定义:
data [] a = [] | a : [] a -- : as an infix operator
data [] a = [] | (:) a ([] a) -- : in prefix positino
可能更容易阅读
-- [] == List
-- (:) == Cons
data List a = EmptyList | Cons a (List a)
通过“递归动作”,我假设你的意思是你看到它被用于模式匹配情况,如
head (a:as) = a
这不是(:)
唯一的;模式匹配可以使用任何数据构造函数完成。