首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell和Ord

Haskell和Ord
EN

Stack Overflow用户
提问于 2012-04-11 22:28:47
回答 3查看 5.7K关注 0票数 4

我正在尝试实现一个简单的min函数,它接受两个参数&如果第一个参数必须按排序顺序出现在第二个参数之前,则返回True,否则返回False:

代码语言:javascript
复制
min :: a -> a -> Bool
min a b = if a < b then True else False

我得到了:

代码语言:javascript
复制
No instance for (Ord a)
arising from a use of `<'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-11 22:30:51

您需要一个类型约束才能使<正常工作:

代码语言:javascript
复制
min :: Ord a => a -> a -> Bool
--     ^^^^^
票数 7
EN

Stack Overflow用户

发布于 2012-04-11 22:42:00

如果使用look at the documentation,您将看到(<)的类型被指定为

代码语言:javascript
复制
(<) :: a -> a -> Bool

这是误导!

类型声明出现在类型类定义中:

代码语言:javascript
复制
class Eq a => Ord a where ...

所以完整的类型是

代码语言:javascript
复制
(<) :: Ord a => a -> a -> Bool

顺便说一句,如果你问ghci (<)的类型是什么,它会回答正确的。

代码语言:javascript
复制
Prelude> :t (<)
(<) :: (Ord a) => a -> a -> Bool

另请注意,在相同的类型类中已经有一个名为min的函数。

代码语言:javascript
复制
min :: Ord a => a -> a -> a

因此,除非隐藏原始的min,否则无法调用函数min。(我不打算向您展示如何。请为您的函数改用其他名称。)

最后,您现在拥有了

代码语言:javascript
复制
min :: Ord a => a -> a -> Bool
min a b = if a < b then True else False

正如莎拉所说,if blah then True else Falseblah是一样的,所以你可以把它简化为更清晰

代码语言:javascript
复制
min :: Ord a => a -> a -> Bool
min a b = a < b

现在Haskell中的运算符只是具有有趣名称的函数-这与

代码语言:javascript
复制
min :: Ord a => a -> a -> Bool
min a b = (<) a b

我们可以进一步简化这一过程:

代码语言:javascript
复制
min :: Ord a => a -> a -> Bool
min = (<)

因此,您的min只是(<)的另一个名称。为什么不简单地使用原始的<而不是您的min

票数 25
EN

Stack Overflow用户

发布于 2012-04-11 23:54:43

这个问题已经有了两个答案,但我认为缺少一个重要的点:

在您的类型签名中需要(Ord a) =>的原因是,您需要将允许的类型约束到您的函数中。

当我定义一个函数function :: a -> a时,我的意思是我的函数将接受类型的数据,并返回相同类型的值。

一个很好的例子是head :: [a] -> a --给定一个any类型的列表,head将返回该列表的第一个参数。这是因为head并不真正“接触”数据本身,所以它是什么都无关紧要。

然而,您的情况并非如此:假设我们有一个数据类型Countries:

代码语言:javascript
复制
data Countries = USA | Nigeria | China | Canada -- yes, I know there are a few missing

min USA CanadaUSA < Canada是没有意义的。

因此,您必须将您的函数限制为可以这样比较的类型:具有Ord (表示有序)类型类的实例的类型。限制它们的方法是在类型签名之前编写(Ord a) =>

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

https://stackoverflow.com/questions/10107990

复制
相关文章

相似问题

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