这个haskell双功能组合的类型是什么?
这个haskell双功能组合的类型是什么?,haskell,currying,lambda-calculus,function-composition,Haskell,Currying,Lambda Calculus,Function Composition,t2=(\x y z->x.y.x) GHCI向我展示了这一点: t2::(b1->b2)->(b2->b1)->p->b1->b2 我不太明白这种类型的签名是怎么产生的。到目前为止,我已经计算出最右边的x基本上是一个函数,它接受一个b2并返回一个b1,然后b1是中间函数y的输入,然后再次输出b2?它是否应该返回新类型的值b3或其他值 首先,让我们以一种方式重写它,以明确哪个参数对应于类型签名的哪个部分: t2 :: (b1->b2) -> (b2->b1) -> p -
t2=(\x y z->x.y.x)
GHCI向我展示了这一点:
t2::(b1->b2)->(b2->b1)->p->b1->b2
我不太明白这种类型的签名是怎么产生的。到目前为止,我已经计算出最右边的x基本上是一个函数,它接受一个
b2
并返回一个b1
,然后b1
是中间函数y
的输入,然后再次输出b2
?它是否应该返回新类型的值b3
或其他值 首先,让我们以一种方式重写它,以明确哪个参数对应于类型签名的哪个部分:
t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2 x y z = x . y . x
根本不使用z::p
,因此我们可以通过考虑
t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3 x y = x . y . x
为什么是那种类型?那么,合成链将x
的结果反馈到y
,将y
的结果反馈到x
。换句话说,y
使您从x
的结果类型返回到x
的参数类型。因此,y
的类型必须是x
的“反向”类型。所以
t3 :: (m->n) -> (n->m) -> ?
t3 x y = x . y . x
作文的类型由“外端”决定,即论点必须是x
的论点类型,结果必须是。。。同样,x
。因此
t3 :: (m->n) -> (n->m) -> m->n
t3 x y = x.y.x
这就是GHCi告诉您的,重命名了类型变量。首先,让我们用一种方式重写它,以明确哪个参数对应于类型签名的哪个部分:
t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2 x y z = x . y . x
根本不使用z::p
,因此我们可以通过考虑
t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3 x y = x . y . x
为什么是那种类型?那么,合成链将x
的结果反馈到y
,将y
的结果反馈到x
。换句话说,y
使您从x
的结果类型返回到x
的参数类型。因此,y
的类型必须是x
的“反向”类型。所以
t3 :: (m->n) -> (n->m) -> ?
t3 x y = x . y . x
作文的类型由“外端”决定,即论点必须是x
的论点类型,结果必须是。。。同样,x
。因此
t3 :: (m->n) -> (n->m) -> m->n
t3 x y = x.y.x
这就是GHCi告诉您的,重命名了类型变量。操作符只对函数进行操作(它用于函数合成-即,首先应用一个函数,然后应用另一个函数得到的结果)。所以我不明白你怎么会认为
t2
的返回值可以是函数以外的任何东西。(这是GHC派生的类型签名末尾的b1->b2
部分。)我明白了,但是为什么(b1->b2),为什么不(b1->b3)?它怎么知道它与右x函数的输出类型相同?因此,您确定您不是指右侧的x.y.z
?给它一个参数z
很奇怪,它根本不用于计算函数结果。(GHC给这个参数的类型是p
,正如您将看到的,它可以是任何类型。)因为x。Yx
表示“首先应用x
,然后对结果应用y
,然后再次对结果应用x
”。如果x
的类型为b1->b2
,那么您需要一个b1
来启动流程(因为x
是首先应用的),并且复合函数必须返回一个b2
(因为x
也是最后应用的)。@RobinZigmond Yes我正在测试未使用的参数在类型签名中显示的方式和位置。这让我很困惑,为什么它出现在(b2->b1)之后,为什么b1和b2类型应用在p之后?这太令人困惑了,
操作符只对函数进行操作(它是用于函数合成的-即,首先应用一个函数,然后应用另一个函数得到的结果)。所以我不明白你怎么会认为t2
的返回值可以是函数以外的任何东西。(这是GHC派生的类型签名末尾的b1->b2
部分。)我明白了,但是为什么(b1->b2),为什么不(b1->b3)?它怎么知道它与右x函数的输出类型相同?因此,您确定您不是指右侧的x.y.z
?给它一个参数z
很奇怪,它根本不用于计算函数结果。(GHC给这个参数的类型是p
,正如您将看到的,它可以是任何类型。)因为x。Yx
表示“首先应用x
,然后对结果应用y
,然后再次对结果应用x
”。如果x
的类型为b1->b2
,那么您需要一个b1
来启动流程(因为x
是首先应用的),并且复合函数必须返回一个b2
(因为x
也是最后应用的)。@RobinZigmond Yes我正在测试未使用的参数在类型签名中显示的方式和位置。这让我很困惑,为什么它出现在(b2->b1)之后,为什么b1和b2类型应用在p之后?太令人困惑了。。。