gpt4 book ai didi

haskell - 函数组合 (.) 如何从内部工作?

转载 作者:行者123 更新时间:2023-12-04 23:35:39 24 4
gpt4 key购买 nike

我正在学习 Haskell。目前,我正在研究函数组合。我了解(至少在基本层面上)(.) 的功能如何可以使用,但有两件事我不明白。

所以函数看起来如下:

(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)

首先,类型声明。 (b -> c) -> (a -> b)本质上意味着函数 f从函数 b 的结果值 ( g ) 中获取参数(取值 a )并返回 c 类型的值.以下部分看不懂 -> a -> c ,为什么会有 -> a那里?为什么是 (b -> c) -> (a -> b) -> c错误的?从我的角度来看(这显然是错误的),函数 g已经在服用 a作为论据。

二、函数体 f . g = \x -> f (g x) . \x -> 是什么意思在这里做吗? Lambda 非常简单。例如 filter (\(a,b) -> a + b > 4) [(1,2),(3,4)] , 而是一个简单的 \x ->让我卡住了。我可能会这样写正文 f . (g x) = f (g x) (这显然又是错误的)。

最佳答案

(b -> c) -> (a -> b) -> c将是一个带有两个函数的函数 f :: b -> cg :: a -> b ,并以某种方式调用g没有 a 类型的初始参数.

对于第二个问题,考虑如何定义 (.)改为使用前缀表示法。 (如果我们为函数使用“常规”名称可能更容易看出;我将在每个代码片段之后将其作为注释包含在内):

(.) f g x = f (g x)    -- compose f g x = f (g x)
x(.) 的“第三个参数” ,或者更准确地说是 (.) f g 返回的函数的参数.这相当于定义 (.) f g直接作为函数,通过将函数放在右侧而不是该函数的最终返回值:
(.) f g x =       f (g x)  -- Implicit function def: compose f g x =       f (g x)
(.) f g = \x -> f (g x) -- Explicit function def: compose f g = \x -> f (g x)

您还可以使用括号来隐式定义函数:
(f . g) x = f (g x)

关于haskell - 函数组合 (.) 如何从内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772488/

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