Haskell Curry匿名函数
我是Haskell和functionall编程新手,有点困惑。为什么我不能使用匿名函数,或者甚至可以使用匿名函数 我有以下代码:Haskell Curry匿名函数,haskell,functional-programming,currying,Haskell,Functional Programming,Currying,我是Haskell和functionall编程新手,有点困惑。为什么我不能使用匿名函数,或者甚至可以使用匿名函数 我有以下代码: largestDivisible :: (Integral a) => a -> a largestDivisible x | x <= 0 = error "NOT A VALID VALUE" | otherwise = head (myFilter (f x) [x-1, x-2..1]) where f x y=
largestDivisible :: (Integral a) => a -> a
largestDivisible x
| x <= 0 = error "NOT A VALID VALUE"
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f x y= x `mod` y == 0
x
是largestDivisible
的参数,但不需要将其作为参数传递给lambda。lambda可以从捕获的上下文中获取x
,并且只需要y
作为参数
第一个版本将部分应用的fx
传递给myFilter
,并且在给出第一个参数的情况下,它是一个一元函数
第二个版本尝试传递两个参数的lambda,而不首先使用部分应用程序获取合适的函数
在第一个示例中使用部分应用程序,或者只编写一个参数(
y
)的lambda。x
是最大可除的
的参数,但不需要将其作为参数传递给lambda。lambda可以从捕获的上下文中获取x
,并且只需要y
作为参数
第一个版本将部分应用的fx
传递给myFilter
,并且在给出第一个参数的情况下,它是一个一元函数
第二个版本尝试传递两个参数的lambda,而不首先使用部分应用程序获取合适的函数
在第一个示例中使用部分应用程序,或者只编写一个参数的lambda(y
)。代码
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f x y= x `mod` y == 0
相当于
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f = \x y -> x `mod` y == 0
| otherwise = head (myFilter ((\x y -> x `mod` y == 0) x) [x-1, x-2..1])
-- ^^^
这相当于
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f = \x y -> x `mod` y == 0
| otherwise = head (myFilter ((\x y -> x `mod` y == 0) x) [x-1, x-2..1])
-- ^^^
请注意,x
的应用程序仍然存在!我们可以通过应用匿名函数(测试步骤)进一步简化:
代码
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f x y= x `mod` y == 0
相当于
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f = \x y -> x `mod` y == 0
| otherwise = head (myFilter ((\x y -> x `mod` y == 0) x) [x-1, x-2..1])
-- ^^^
这相当于
| otherwise = head (myFilter (f x) [x-1, x-2..1])
where f = \x y -> x `mod` y == 0
| otherwise = head (myFilter ((\x y -> x `mod` y == 0) x) [x-1, x-2..1])
-- ^^^
请注意,x
的应用程序仍然存在!我们可以通过应用匿名函数(测试步骤)进一步简化:
为什么使用
myFilter
而不是filter
?我认为更合适的方法是使用find
而不是filter
。为什么要使用myFilter
而不是filter
?我认为更合适的方法是使用find
而不是filter
。对于您来说,第二个代码片段:空格重要吗?写\x有什么不同吗代码>或\x…
?好吧,我想我明白了。在第三个代码片段中,我创建了一个函数,向其传递x(您标记的x),然后传递列表。谢谢你!显然,第四个代码片段是“最好的”。@SparkMonkay\x
与\x
相同。当然,\x y
中的空格很重要,否则\xy
将变量xy
作为参数。这就是我的意思,\x y z
与\x y z
相同。对于第二个代码片段,空格重要吗?写\x有什么不同吗代码>或\x…
?好吧,我想我明白了。在第三个代码片段中,我创建了一个函数,向其传递x(您标记的x),然后传递列表。谢谢你!显然,第四个代码片段是“最好的”。@SparkMonkay\x
与\x
相同。当然,\x y
中的空格很重要,否则\xy
将变量xy
作为参数。这就是我的意思,\x y z
与\x y z
相同。我看到了,谢谢。很遗憾,我没有从上下文中提取x并将其应用到函数中。我看到了,谢谢。遗憾的是,我没有从上下文中提取x并将其应用到函数中。