Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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_Currying_Lambda Calculus_Function Composition - Fatal编程技术网

这个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之后?太令人困惑了。。。