首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >->和=>符号之间的差异。它们是什么意思?

->和=>符号之间的差异。它们是什么意思?
EN

Stack Overflow用户
提问于 2019-06-26 04:24:04
回答 2查看 1.5K关注 0票数 9

在Haskell中,当我们讨论类型声明时。

我见过->=>

举个例子:我可以自己声明类型。

代码语言:javascript
复制
addMe :: Int -> Int -> Int
addMe x y = x + y

而且它工作得很好。

但是如果我们看一下:t sqrt,我们会得到:

代码语言:javascript
复制
sqrt :: Floating a => a -> a

我们在什么时候使用=>,什么时候使用->?我们什么时候用“胖箭头”,什么时候用“瘦箭头”?

EN

回答 2

Stack Overflow用户

发布于 2019-06-26 04:28:00

“细箭头”用于函数类型(t1 -> t2是接受t1类型的值并生成t2类型的值的函数的类型)。

“胖箭头”用于类型约束。它将多态函数上的类型约束列表与类型的其余部分分开。因此,在给定Floating a => a -> a的情况下,我们有了函数类型a -> a,该函数的类型可以接受任何类型a的参数,并生成该类型的结果,并添加了约束Floating a,这意味着该函数实际上只能与实现Floating类型类的类型一起使用。

票数 12
EN

Stack Overflow用户

发布于 2019-06-28 01:33:26

->是函数的构造器,=>用于约束,这是一种在Haskell中称为类型类的“接口”。

下面是一个小示例:

代码语言:javascript
复制
sum :: Int -> Int -> Int
sum x y = x + y

该函数只允许Int类型,但如果你想要一个大的int或一个小的int,你可能想要Integer,如何告诉它同时使用这两种类型?

代码语言:javascript
复制
sum2 :: Integral a => a -> a -> a
sum2 x y = x + y

现在,如果您尝试这样做:

代码语言:javascript
复制
sum2 3 1.5

它会给你一个错误

此外,您可能想知道两个数据是否相等,您希望:

代码语言:javascript
复制
equals :: Eq a => a -> a -> Bool
equals x y = x == y

现在如果你这样做了:

代码语言:javascript
复制
3 == 4

没关系

但是如果你创建了:

代码语言:javascript
复制
data T = A | B

equals A B

它将为您提供:

代码语言:javascript
复制
error:
    • No instance for (Eq T) arising from a use of ‘equals’
    • In the expression: equals A B
      In an equation for ‘it’: it = equals A B

如果你想让它工作,你必须这样做:

代码语言:javascript
复制
data T = A | B deriving Eq

equals A B

False
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56761514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档