b -> c) -> a -> (a1 -6ren">
gpt4 book ai didi

haskell - 如何理解Haskell中的函数 "(.)(.)"

转载 作者:行者123 更新时间:2023-12-03 05:53:49 24 4
gpt4 key购买 nike

我是 Haskell 的初学者,我遇到了函数 (.)(.),我使用 :t 来获取它在 GHCi 中的类型:

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

如何理解这里的类型 (.)(.)::(a -> b -> c) -> a -> (a1 -> b) -> a1 -> c ?我很困惑。

最佳答案

这是组合运算符组合运算符本身的部分应用。一般来说,我们知道如果我们将 (.) 应用于某个函数 f::x -> y,那么

>>> :t (.) f
(.) f :: (a -> x) -> a -> y

因为类型的排列方式:

(b -> c) -> (a -> b) -> a -> c
x -> y
--------------------------------
(a -> x) -> a -> y

我们删除第一个参数,并将剩余的 bc 替换为给定参数的相应类型。

这里,f 又只是 (.),这意味着我们识别 x ~ (b -> c)y ~ (a -> b) -> a -> c。再次排列类型

(a ->   x   )  -> a ->              y
b -> c (a -> b) -> a -> c

由于a出现在顶部和底部,我们需要为底部的a选择一个新的变量名称; GHC 选择了 a1:

(a ->   x   )  -> a ->               y
b -> c (a1 -> b) -> a1 -> c

将两者放在一起会产生您在 GHCi 中看到的类型。

(a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
<小时/>

抛开解剖学笑话不谈,什么是 (.)(.)

假设你有一个函数 f::a -> b,但你想要一个函数 g::a -> c,也就是说,你想要 f 但返回类型不同。您唯一能做的就是找到一个辅助函数 h::b -> c 来为您转换返回值。您的函数 g 就是 hf 的组合:

g = h . f

但是,您可能有一个更通用的函数 h'::t -> b -> c,它可以以多种方式将 b 类型的值转换为 c 类型的值,具体取决于某些参数 x::t 的值。然后,根据该参数,您可以得到许多不同的 g

g = (h' x) . f

现在,给定 h'xf,我们可以返回 g,所以让我们编写一个函数来执行以下操作:将 f 的返回值从 b 类型的值“提升”为 c 类型的值>,给定一个函数 h' 和一些值 x:

promote h' x f = (h' x) . f

您可以将任何函数机械地转换为无点形式;我不熟悉细节,但使用 PointFree.io产生

promote = ((.) .)

这只是部分应用(.) (.)写成一个节,即:

((.) (.)) h' x f == (h' x) . f

因此,我们的“胸部”运算符只是一个广义的预合成运算符。

关于haskell - 如何理解Haskell中的函数 "(.)(.)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207345/

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