List 用filter和lambda表达式理解Haskell函数
这一个输出List 用filter和lambda表达式理解Haskell函数,list,haskell,filter,List,Haskell,Filter,这一个输出[-2,-1,2],但为什么呢?有人能一步一步地解释一下Haskell在这里做了什么来获得这个输出吗 j :: [Int] j = filter ((\h x -> h x > x) (\y -> y*y)) [-2,-1,0,1,2] 相当于 (\h x -> h x > x) (\y -> y*y) 因此,您只需将列表中的每个数字平方,并将其与原始数字进行比较,以了解为什么输出是这样的: \x -> x*x > x 对于每个负数
[-2,-1,2]
,但为什么呢?有人能一步一步地解释一下Haskell在这里做了什么来获得这个输出吗
j :: [Int]
j = filter ((\h x -> h x > x) (\y -> y*y)) [-2,-1,0,1,2]
相当于
(\h x -> h x > x) (\y -> y*y)
因此,您只需将列表中的每个数字平方,并将其与原始数字进行比较,以了解为什么输出是这样的:
\x -> x*x > x
对于每个负数,该谓词将返回
True
(因为每个负数的平方都是正数,因此大于原始数,对于每个大于1的正数。由于您在Int
s上操作,这意味着0
和1
是唯一无法通过该谓词的数。它会过滤函数中的列表([-2,-1,0,1,2]
)通过谓词,谓词是表达式((\hx->hx>x)(\y->y*y))
这里我们看到两个lambda表达式。前者将两个参数h
和x
作为输入,如果hx
大于x
,则返回True
。第二个表达式将参数y
作为输入,并返回y*y
(因此它将输入平方)
第二个lambda表达式作为第一个lambda表达式的第一个参数,这意味着:
-- original: [-2, -1, 0, 1, 2]
-- squared: [ 4, 1, 0, 1, 4]
-- comparison: [ T, T, F, F, T]
因此,一个函数将变量x
作为输入,当且仅当(\y->y*y)x
大于x
时返回True
。我们可以再次使用以下方法进一步减少该函数:
((\h x -> h x > x) (\y -> y*y))
-----------------------------------
= \x -> (\y -> y*y) x > x
因此,它是一个谓词,用于检查给定x
的x*x>x
,或者“变量应小于该变量的平方”
因此,我们在这里过滤列表[-2,-1,0,1,2]
,以便只保留其平方较大的元素。因此,如果我们对此进行评估,我们会看到:
\x -> (\y -> y*y) x > x
-------------------------
= \x -> x*x > x
所以结果是[-2,-1,2]
x|x*x|x*x > x
---+---+-------
-2| 4| True
-1| 1| True
0| 0| False
1| 1| False
2| 4| True