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

Haskell定义的类型

Haskell定义的类型,haskell,types,Haskell,Types,学习哈斯克尔第一原理。哈斯克尔的绝对初学者。 如果: 实际的功能是什么?虽然做了大量的练习,效果很好,也要感谢你,但我还是被卡住了。A->B是否表示两种不同的类型,如“字符串”->“字符”?只是想让我的头绕着它转 否,具体类型以大写字母开头。因此A->B表示您定义的类型A和B,而不是使用数据A=。。。表达式,例如: data A = Foo | Bar Int | Qux String A 如果签名包含带有小写字母的标识符,则它是一个类型变量。例如foo::a->b,意味着a和b可以被任何类型

学习哈斯克尔第一原理。哈斯克尔的绝对初学者。 如果:

实际的功能是什么?虽然做了大量的练习,效果很好,也要感谢你,但我还是被卡住了。A->B是否表示两种不同的类型,如“字符串”->“字符”?只是想让我的头绕着它转

否,具体类型以大写字母开头。因此A->B表示您定义的类型A和B,而不是使用数据A=。。。表达式,例如:

data A = Foo | Bar Int | Qux String A
如果签名包含带有小写字母的标识符,则它是一个类型变量。例如foo::a->b,意味着a和b可以被任何类型替换。所以foo是一个函数,可以是a->B,也可以是a->Int、Char->B和Char->Int


您还可以向签名添加类型约束,以限制可以使用例如a和b的类型。与foo::Show a一样,Num b=>a->b限制a和b,这样类型a和b就应该存在一个实例Show a和实例Num b,这样foo就可以在这些类型上定义。

谢谢Willem,Chepner。你的回答让我想起:

data A
data B
funcAJ :: A -> B
funcAJ a = a
       where a = b
             b = undefined

这个类型检查为funcAJ::A->B,我理解。非常感谢

没有大写类型是实类型。而小写类型是类型变量。如果这是实际代码,那么从某种意义上说,undefined是func唯一有效的定义。B没有人居住,因此无法从func返回B值。就这点而言,也没有办法调用func,因为没有任何A的值可以作为参数提供。这与您可能认为它的作用不同。where中的a隐藏函数参数a。它们是同名的不同变量。作为函数参数的a是类型a,而在where中定义并从函数返回的a是类型B。这是因为它被定义为对B求值,而B又被定义为未定义。而未定义的几乎可以采用任何类型。这只是一种编写funcAJ a=undefined.Ok的奇特方式。谢谢,但我有很高的希望我找到了答案。我现在迷路了。你能提出一个类型检查且正确的函数吗?除非你给你的类型a和B一些未定义的数据构造函数或其他返回bottom的构造是类型a->B函数唯一可能的实现。
data A
data B
funcAJ :: A -> B
funcAJ a = a
       where a = b
             b = undefined