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_Ml - Fatal编程技术网

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中不是分号分隔符,而是终止符?感谢您的清晰解释,我理解了!)