Function 关于Haskell中功能成分的困惑

Function 关于Haskell中功能成分的困惑,function,haskell,functional-programming,composition,Function,Haskell,Functional Programming,Composition,我知道。fGx=fGx。假设f有Int->Int类型,g有Int->Int->Int类型。现在让h由hxy=fgxy定义。以下哪项陈述是正确的,为什么不是 a。h=f。g b。hx=f。Gx c。h x y=f。GxY 据推测,只有b。是真的,而其他的都是假的。我想是a。和b。相当于。。。A.就是说两个函数相等。只有当我在两边的末尾加一个参数时,这两个函数才相等。所以我得到hx=f。Gx。现在是运算符,所以函数应用程序优先于它,所以f。g x=f。这看起来像是一个家庭作业,所以我不会给出哪一个是

我知道。fGx=fGx。假设f有Int->Int类型,g有Int->Int->Int类型。现在让h由hxy=fgxy定义。以下哪项陈述是正确的,为什么不是

a。h=f。g

b。hx=f。Gx

c。h x y=f。GxY


据推测,只有b。是真的,而其他的都是假的。我想是a。和b。相当于。。。A.就是说两个函数相等。只有当我在两边的末尾加一个参数时,这两个函数才相等。所以我得到hx=f。Gx。现在是运算符,所以函数应用程序优先于它,所以f。g x=f。这看起来像是一个家庭作业,所以我不会给出哪一个是正确的答案

<>你认为A和B不一样。如果f。g应用于x,你可以从的定义得到


但是b是f。gx,它不会扩展到fgx。如果您使用的定义是b,您将在其他人的注释中看到它的含义。

函数组合的初始定义有点混乱,因此我将以不同的方式编写它:

f . g = \a -> f (g a)
这意味着f。g返回一个函数,该函数首先将参数应用于g,然后将参数的结果应用于f。这在类型签名中也很清楚:

(.) :: (b -> c) -> (a -> b) -> (a -> c)
现在对于函数h,它有一种类似于h::a->a->a的类型。记住->是右关联的,因此类型可以写成h::a->a->a。从本质上讲,h::a->b,但这种类型会导致错误,因为b和a是不可伸缩的。将只允许对第一个函数应用一个参数,因此:

-- One could write,
h x y = f (g x y)
-- But One could also write
h x = f . g x
-- Or, more clearly:
h x = (f) . (g x)
这是因为Haskell函数是curried函数,所以我们可以对g应用一些参数,而无需完全计算它

如果我们想象一下如果我们申请会发生什么。直观地,然后简化,我们可以看到它是如何工作的:

h x = \a -> f ((g x) a)
h x = \a -> f (g x a)
h x a = f (g x a)
是的,答案是b。这是因为。在移动到下一个函数之前,只允许对第一个函数应用一个参数


现在你的工作可以通过简化来解决其他不正确的解决方案。不太难。

我遗漏了什么吗?如果g有Int->Int->Int类型,那么gx有Int->Int类型,而fgx是一个类型错误。你的意思是h是由hxy=fgxy定义的吗?顺便说一句,欢迎使用堆栈溢出!如果你在要求回复评论后逗留一段时间,这通常会有所帮助,因为这会加快事情的发展。诚然,我们这次的反应不是很快。假设你的家庭作业是个朋克,写下更好的答案h=。f gno,a。和c。等效于eta减少量:fx=gxf=g。这意味着fx=gx和f=g都等于a。对的B不准确的C没道理。当然,fxy=gxy与fx=gx的测量值相同。好的,这是有道理的,谢谢。因此,我目前的理解如下[正确吗?]:当hx=f时,A为真。gx,也就是fgx。输入错误,因为gx::Int->Int,但f需要Int作为输入。它们都是Int->Int的函数,所以B。当h x y=f时为真。Gxy,这是由defn提出的。函数的形式。公司。fgxy,也就是hxy。这是真的。C h x y=f。g x y=f g x y,由于与a相同的原因,键入错误。如果这些解释是正确的,我们可以把它作为对我问题的回答张贴出来@DominikTeiml为了确定expA=expB,我们首先需要看看这两个表达式是否格式良好,这在Haskell中意味着有一个类型。如果我写head,这个表达式没有类型,即格式不正确。gven表示f和g的类型,表示f。g是。。。病态的?好的?选择正确答案。@DominikTeiml更正后的问题为h x y=f g x y,因此b为真。@Willenss格式不正确,因为f的输入是Int,但g::Int->Int->Int。@DominikTeiml correct.:Fgx=fgx,gx::Int::Int->Int,f::Int->Int。通常,对于g::a->b和f::c->d,f.g::a->d和b~c。这里g::Int->Int->Int类型中的箭头关联到右边,因此f.g必须有一个Int->Int~Int类型,但事实并非如此。
h x = \a -> f ((g x) a)
h x = \a -> f (g x a)
h x a = f (g x a)