Haskell定义的类型
学习哈斯克尔第一原理。哈斯克尔的绝对初学者。 如果: 实际的功能是什么?虽然做了大量的练习,效果很好,也要感谢你,但我还是被卡住了。A->B是否表示两种不同的类型,如“字符串”->“字符”?只是想让我的头绕着它转 否,具体类型以大写字母开头。因此A->B表示您定义的类型A和B,而不是使用数据A=。。。表达式,例如: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可以被任何类型
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