Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell复变函数合成_Haskell_Functional Programming - Fatal编程技术网

Haskell复变函数合成

Haskell复变函数合成,haskell,functional-programming,Haskell,Functional Programming,我正在努力学习Haskell中的函数组合。我有以下练习。 我有函数:hxy=f(gxy),我需要找到与之相等的函数组合: a) f . g b) (f.).g c) (.)f(.g) d) f(.g) 我知道,(.)fg=f.g=f(gx),但我不理解这个复杂的函数组合正确答案是(b):(f.).g 让我们分析一下这个函数。(f.)部分是(.f)的缩写,因此我们已经解决了该部分,因此函数(不含语法糖)是: (.) ((.) f) g 现在我们可以将第一个(.)函数重写为lambd

我正在努力学习Haskell中的函数组合。我有以下练习。
我有函数:
hxy=f(gxy)
,我需要找到与之相等的函数组合:

a) f . g  
b) (f.).g  
c) (.)f(.g)  
d) f(.g)

我知道,
(.)fg=f.g=f(gx)
,但我不理解这个复杂的函数组合

正确答案是(b)
(f.).g

让我们分析一下这个函数。
(f.)
部分是
(.f)
的缩写,因此我们已经解决了该部分,因此函数(不含语法糖)是:

(.) ((.) f) g
现在我们可以将第一个
(.)
函数重写为lambda表达式:

\x -> ((.) f) (g x)
\x y -> f (g x y)
现在,当我们进一步计算左边的第二个函数(
(.f)
)时,我们得到:

\x -> (.) f (g x)
\x -> (\y -> f ((g x) y))
或:

因此,如果我们将
(.)
函数转换为lambda表达式,我们将得到:

\x -> (.) f (g x)
\x -> (\y -> f ((g x) y))
现在我们可以让这个表达更优雅<代码>(g x)y可以重写为
g x y

\x -> (\y -> f (g x y))
我们可以将嵌套的lambda表达式重写为单个lambda表达式:

\x -> ((.) f) (g x)
\x y -> f (g x y)
这正是我们想要的。

您也可以使用
()

comp2 = (.) (.) (.)
comp2 f g x y == f (g x y)

(.)的评估

-- comp
(.) = \f -> \g -> x -> f (g x)

-- evaluate
(.) (.) (.)
(\f -> \g -> \x -> f (g x)) (.) (.)
(\g -> \x -> (.) (g x)) (.)
\x -> (.) ((.) x)
\x -> (\f -> \g -> \x' -> f (g x')) ((.) x)
\x -> \g -> \x' -> ((.) x) (g x')
\x -> \g -> \x' -> ((\f -> \g' x'' -> f (g' x'')) x) (g x')
\x -> \g -> \x' -> (\g' -> \x'' -> x (g' x'')) (g x')
\x -> \g -> \x' -> \x'' -> x ((g x') x'')
\x -> \g -> \x' -> \x'' -> x (g x' x'')

-- alpha rename
\f -> \g -> \x -> \y -> f (g x y)

-- collapse lambdas 
\f g x y -> f (g x y)

理解
()
组合的模式

-- comp2
comp2 = (.) (.) (.)
comp2 f g x y == f (g x y)

-- comp3
comp3 = (.) (.) comp2
comp3 f g x y z == f (g x y z)

-- comp4
comp4 = (.) (.) comp3
comp4 f g w x y z == f (g w x y z)

我想我明白了。所以d)是
f(.g)=f(.g)=f(\x->gx)
?@Tomasz:最后一步不正确:
(.g
\hx->g(hx)
。因此,对于您的示例,
f(.g)=f((.g)=f(\hx->g(hx))
“h”缺少函数?@Tomasz:
h
是一个参数,但它确实应该是一个函数。@WillemVanOnsem
f(.g)
不是
f(.g)
——后者是
f(g.)
。(这是关于你的评论,而不是你的答案。)旁注:写
f.g=f(gx)
有点草率。事实上,
f.g=\x->f(gx)
。我投了反对票,原因有三:1。问题中显示的知识水平不支持这样的假设,即这种双重作文的行为对提问者来说是显而易见的,因此需要在开始时使用一些解释性的句子。2.这实际上并没有把问题“结”回到原来的问题上,因此需要在结尾处用一些解释性的句子来说明我们如何从这种形式的双重组合开始,并以四种可能的选择之一结束。3.我同意这是一个愚蠢的名字。所以不要传播这个名字@DanielWagner感谢您的全面评论。我对我的答案做了一些调整,希望能提供更多信息。