( - >)有数据构造函数吗?

use*_*522 7 haskell

我知道(->)类型被定义为data (->) t1 t2.我想知道该(->)类型的数据构造函数是什么?

Joa*_*ner 7

不,(->)没有数据构造函数,因为函数不是代数数据类型.事实上,ghci说

Prelude> :inf (->)
data (->) t1 t2     -- Defined in ‘GHC.Prim’
Run Code Online (Sandbox Code Playgroud)

是一个谎言,因为这不是如何(->)定义.事实上,没有定义,因为函数是一个非常原始的概念.

在某种意义上,lambda表达式\x -> e(或者,等效地,函数定义)是​​类型值的"构造函数" a -> b,但是您不能对其进行模式匹配.相反,您使用函数应用程序(f e)来解构("使用")函数.

  • 数据类型的一个关键属性是您可以匹配它们并找出使用的构造函数.你不能在函数上做到这一点,因为这相当于决定任意程序之间的等价性,这不是计算机可以做的事情(停止问题......). (2认同)
  • "在我看来,他们适合于同样的代数".非也!我认为没有人声称函数类型不是"_algebraic_",只是它们不是_data_类型.Haskell 2010报告的4.1.2和4.2.1节将"数据"和"函数"类型定义为两种不同类型的类型,当涉及到语言的其他部分时,这种区别很重要; 例如,正如@JoachimBreitner所示,Haskell确实允许你对任何_data_值进行模式匹配(只要你设法在范围内获取构造函数!),而它不允许在_function_值上进行模式匹配. (2认同)