Haskell 如何定义此函数的类型配置文件?
我必须定义此函数的类型配置文件:Haskell 如何定义此函数的类型配置文件?,haskell,functional-programming,ml,Haskell,Functional Programming,Ml,我必须定义此函数的类型配置文件: twice f x = f (f x); 结果应该如下,但我真的不明白为什么 ('a -> 'a) -> 'a -> 'a (a->a)->a->a是正确的答案。让我们把它分成几部分来找出原因 您的函数有两个参数,f和x,因此签名将有三个部分,例如,a->c->d 第一个参数是一元函数,它使a=(a->b)(记住a可以是任何类型,只要它在签名中只出现一次)签名看起来像(a->b)->c->d 两次的结果与第一个参数的结果相同,这使得d=b和
twice f x = f (f x);
结果应该如下,但我真的不明白为什么
('a -> 'a) -> 'a -> 'a
(a->a)->a->a
是正确的答案。让我们把它分成几部分来找出原因
f
和x
,因此签名将有三个部分,例如,a->c->d
a=(a->b)
(记住a
可以是任何类型,只要它在签名中只出现一次)签名看起来像(a->b)->c->d
的结果与第一个参数的结果相同,这使得d=b
和签名(a->b)->c->b
f
两次将的第二个参数作为其参数-这使得c=a
和签名如下:(a->b)->a->b
两次
应用于它自己的输出,这意味着a=b
-这将生成最终签名(a->a)->a->a
你在使用高阶函数,或者数学中的GoF。Type:t以查看类型。参考这本书-学习Haskell我必须自己定义它,不必键入任何内容。我最近看到一些在Haskell“语句”末尾使用分号的SO问题。你从哪本书/学习资源中得到的,因为它不是必需的,也不是典型的哈斯克尔。@ErikR我认为这是ML,不是哈斯克尔。还要注意类型变量上的单引号前缀。@DanielWagner,在ML中不是分号分隔符,而是终止符?感谢您的清晰解释,我理解了!)