lambda函数中的冒号?

时间:2016-09-26 15:53:48

标签: haskell lambda

我不理解冒号在以下lambda表达式中的作用:

myFunction :: [Int] -> [Int]
myFunction li = foldr (\x acc -> if x < 10 then x : acc else acc) [last li] li

我习惯于看到冒号进行递归操作,但看起来这个冒号实际上是在对当前的累加器列表说 prepend ,是吗?

1 个答案:

答案 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

这不是(:)唯一的;模式匹配可以使用任何数据构造函数完成。