gpt4 book ai didi

haskell - Haskell 是否支持部分应用函数的组合?

转载 作者:行者123 更新时间:2023-12-04 18:01:44 24 4
gpt4 key购买 nike

例如,我做不到

f = ((*2).(+)) 3

没关系,因为我总能做到
f = (*2).(+3)

但是当我想创建一个函数列表时,这有点不方便,例如
map ((*2).(+)) [1, 2, 3]

然而
map (+) [1, 2, 3]

会好的。

当然,我总是可以使用 lambda 表示法来实现柯里化(Currying):
map (\x y -> 2*(x + y)) [1, 2, 3]

据我所知,GHC 不喜欢编写部分应用的函数,因为它不知道如何将函数类型提供给像 (*2) 这样的操作。
(+) 2 :: Num a => a -> a 
(*2) :: Num a => a -> a

但我一直认为这应该是一件很自然的事情:(+) 的输出类型是 Num a => a,所以 (*2) 应该能够“吃掉”它。

我的问题是:这是否以某种方式实现?或者,有人知道为什么 Haskell 没有实现这么简单的事情吗?

最佳答案

Haskell 支持部分函数的组合,但类型不匹配。组合就是功能

(.) :: (b -> c) -> (a -> b) -> a -> c

在您的情况下,您有两个功能
(*2) :: Num a => a -> a
(+) :: Num a => a -> a -> a

当您编写此函数时,结果类型将是
((*2).(+)) :: (Num (a -> a), Num a) => a -> a -> a

那不是你想要的。你可以重写你的函数 f(.) (*2) . (+)但我认为 lambda 更具可读性。

你混淆了部分功能和部分应用。部分函数是不为整个域定义的函数,部分应用是将多个参数固定到函数的过程,产生较小的函数。

关于haskell - Haskell 是否支持部分应用函数的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46011518/

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