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

标签 haskell lambda syntax function-composition

我正在学习 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/

相关文章:

lambda - 修复 lambda 表达式的 uncrustify 格式

c++ - 当 std::function<X()> 是 X 类的成员时,为什么不能编译它?

python - _never_可能出现在Python代码中的字符序列示例?

python - 无效的Python语法定义函数

json - 使用 Haskell 对巨大的 json 数组进行子采样

haskell - 如何读取大的csv文件?

scala - 有使用软件事务内存的实际经验吗?

python - 从具有最小元素值的元组列表中提取元组的优雅方法

haskell - HSpec 中的多个 before 函数?

c++ - 方法声明中此语法的含义是什么