gpt4 book ai didi

haskell - 谁能解释一下这个 haskell 难题?

转载 作者:行者123 更新时间:2023-12-02 13:22:50 28 4
gpt4 key购买 nike

我知道使用 .运算符将函数链接在一起,如下所示:

isLessThanZero x 
| x < 0 = True
| otherwise = False

(isLessThanZero . negate) 3 -- Produces True

或者用 $:

getNegNumbers x = map (*x) [-1, -2, -3]

filter isLessThanZero $ getNegNumbers 2 -- Produces [-2, -4, -6]

但是如果我要做这样的事情:

(subtract . negate) 1 2 -- 3
negate $ subtract 1 2 -- -1

这里的结果是不同的,并且没有意义,因为这两个函数接受不同数量的参数。对于 .negate 函数检查数字是否为负数,但提供了两个参数。这可能意味着该表达式是左结合的。

negate (subtract 1 2) -- -1
(subtract . negate) 1 2 -- 3

但这很令人困惑,因为在第一个示例中:

(isLessThanZero . negate) 3

该表达式产生 True,这意味着先执行函数 negate,然后调用 isLessThanZero。但在最新的示例中,似乎先调用了 subtract,然后调用了 negate。所以我不确定这里发生了什么。但这更令人困惑:

subtract 1 2 -- Produces 1!

这意味着整个表达式:

(subtract . negate) 1 2 -- Produces 3!

是使用函数链的副作用。

我的理论是这样的,分解如下:

我们知道 2 - (-1) = 3。所以,该表达式仍然是右结合的..我认为。 negate 仍然像前面的示例一样首先被调用,只是它影响第一个参数,而不是两个参数,这是有道理的,因为 negate 只接受一个参数,并且我们没有将函数映射到全部。

那么,当涉及到具有不同数量参数的链接函数时,Haskell 应该如何应对?

最佳答案

Haskell 方法是将所有函数视为采用一个参数并返回一个值,即使对于具有多个参数的函数也是如此。

因此,subtract 函数的签名为:

subtract :: Num a => a -> a -> a

还可以看到:

subtract :: Num a => a -> (a -> a)

一个函数,它接受一个数字参数并返回一个函数,该函数接受一个数字值并返回一个数字值。

考虑到(.),它的签名是:

(.) :: (y -> z) -> (x -> y) -> x -> z

它需要两个函数,一个返回一个函数。

如果将其应用于(subtract . negate),您将得到以下签名:

(subtract . negate) :: Num a => (a -> (a -> a)) -> (a -> a) -> (a -> (a -> a))

地点:

x = a
y = a
z = a -> a

该函数的签名完全有效。

请注意,减去 1 2 的作用类似于 2 - 1

(subtract . negate) 函数是一个函数,它接受一个数值,对其求反并返回一个函数,该函数接受另一个数值,从该数值中减去负值。

另请注意,negate (subtract 1 2) 等于 -1,而不是 3!

关于haskell - 谁能解释一下这个 haskell 难题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32286860/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com