Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 用filter和lambda表达式理解Haskell函数_List_Haskell_Filter - Fatal编程技术网

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