Haskell Curry匿名函数

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=

我是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= 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并将其应用到函数中。