如何解决`Ord a =>`或`Num a =>`
|| 我具有以下功能:which (x:xs) = worker x xs
worker x [] = x
worker x (y:ys)
| x > y = worker y ys
| otherwise = worker x ys
并且想知道如何定义上述函数functions1ѭ和worker
的类型签名?
例如,以下哪种方式最适合作为工作人员的类型签名?
worker :: Num a => a -> [a] -> a
,
要么
worker :: Ord a => a -> [a] -> a
?
我真的很困惑,不知道应该选择哪三个。我很感谢您的想法。谢谢。
解决方法
如果您在没有显式类型签名的情况下定义函数,Haskell将推断出最通用的函数。如果不确定,这是弄清楚如何读取定义的最简单方法;然后可以将其复制到您的源代码中。一个常见的错误是错误地键入一个函数,然后在其他地方得到一个令人困惑的类型错误。
无论如何,您可以通过在ghci中键入
:i Num
或阅读文档来获取Num
类的信息。 Num
类为您提供+
,*
,-
,negate
,abs
,signum
,fromInteger
,以及every15ѭ和Show
的每个功能。请注意,<
和>
不存在!要求Num
的值并尝试对其进行比较实际上会产生类型错误-并非每种数字都可以进行比较。
因此应为Ord a => ...
,因为如果尝试使用Num a => ...
会产生类型错误。
, 考虑一下函数的作用,您会看到see22ѭ返回xs
中的最小值。最小值可以是多少? 24英镑的清单!
, 问ghci,看看它说什么。我只是将您的代码原样复制粘贴到文件中,然后将其加载到ghci中。然后,我使用:t
(这是一个特殊的ghci命令)来确定事物的类型。
ghci> :t which
which :: (Ord t) => [t] -> t
ghci> :t worker
worker :: (Ord a) => a -> [a] -> a
在大多数情况下,Haskell的类型推断非常聪明。学会信任它。其他答案足以说明为什么在这种情况下应使用“ 24”。我只是想确保明确地提到了ghci作为确定事物类型的技术。
, 我总是会选择Ord类型约束。它是最通用的,因此可以更频繁地重用。
与Nord相比,使用Num没有优势。
因为Int不是多态的,并且不需要字典查找,所以它可能具有一个小的优势。如果需要提高性能,我会使用Ord并使用专门的编译指示。
, 编辑:评论后更改了我的答案。
这取决于您希望能够进行比较。如果您想比较Double
,Float
,Int
,Integer
和Char
,请使用Ord
。如果您只想比较Int
,则使用Int
。
如果您还有另一个类似的问题,只需查看类型类的实例即可知道您希望在函数中使用哪些类型。
Ord文档
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。