Function Haskell泛型
所以我刚开始学习Haskell,我已经在这上面呆了很长时间了。所以我有一个函数,在偏移量为负数(最小值为0)后计算一个数字。我用显式显示的类型实现了这个函数Function Haskell泛型,function,haskell,types,Function,Haskell,Types,所以我刚开始学习Haskell,我已经在这上面呆了很长时间了。所以我有一个函数,在偏移量为负数(最小值为0)后计算一个数字。我用显式显示的类型实现了这个函数 offSetter :: Int -> Int -> Int offSetter number offset | number - offset >= 0 = number - offset | otherwise = 0 但当我试图将其更改为使用下面的泛型类型时,它总是给我一个错误。我做错了吗 offS
offSetter :: Int -> Int -> Int
offSetter number offset
| number - offset >= 0 = number - offset
| otherwise = 0
但当我试图将其更改为使用下面的泛型类型时,它总是给我一个错误。我做错了吗
offSetter :: Num a => a -> a -> a
offSetter number offset
| number - offset >= 0 = number - offset
| otherwise = 0
我得到的错误是:
* Could not deduce (Ord a) arising from a use of '>='
from the context: Num a
bound by the type signature for:
offSetter :: forall a. Num a => a -> a -> a
at src\test.hs:57:1-33
Possible fix:
add (Ord a) to the context of
the type signature for:
offSetter :: forall a. Num a => a -> a -> a
* In the expression: number - offset >= 0
In a stmt of a pattern guard for
an equation for `offSetter':
number - offset >= 0
通过添加Ord a解决了此问题:
offSetter :: (Num a, Ord a) => a -> a -> a
offSetter number1 offSet
| number1 - offSet >= 0 = number1 - offSet
| otherwise = 0
通过添加Ord a解决了此问题:
offSetter :: (Num a, Ord a) => a -> a -> a
offSetter number1 offSet
| number1 - offSet >= 0 = number1 - offSet
| otherwise = 0
正如您所发现的,您需要添加类型类
Ord
,作为带有以下类型签名的类型a
的约束:
offSetter :: (Num a, Ord a) => a -> a -> a
这是因为Ord
是带有比较运算符的类型类,如(>=)
所以之所以使用Ord,是因为有些元素(比如字符串)不适用于Num
否,因为
String
不是Num
typeclass的成员,所以原始声明已经将其排除在类型a
的可能候选之外。如前所述,您需要使用Ord
,以确保类型a
具有可用的运算符(>=)
。如您所发现的,您需要添加类型类Ord
,作为带有以下类型签名的类型a
的约束:
offSetter :: (Num a, Ord a) => a -> a -> a
这是因为Ord
是带有比较运算符的类型类,如(>=)
所以之所以使用Ord,是因为有些元素(比如字符串)不适用于Num
否,因为
String
不是Num
typeclass的成员,所以原始声明已经将其排除在类型a
的可能候选之外。如前所述,您需要使用Ord
,以确保类型a
具有可用的运算符(>=)
。您遇到了什么错误?建议我使用Ord?更新错误:)您是否尝试按照编译器的建议进行操作?=
不适用于所有数字,复杂数字如何。因此Num和Ord在Haskell中是独立的。更新:我终于设法解决它了!!!!我使用偏移器::(数量a,顺序a)=>a->a->a。。所以使用Ord是因为有字符串之类的元素不适用于Num?您得到了什么错误?它建议我使用Ord?更新错误:)您是否尝试按照编译器的建议进行操作?=
不适用于所有数字,复杂数字如何。因此Num和Ord在Haskell中是独立的。更新:我终于设法解决它了!!!!我使用偏移器::(数量a,顺序a)=>a->a->a。。所以使用Ord是因为有些元素,比如字符串,不适用于Num?这太完美了。您必须这样做,因为尽管(据我所知)没有实现Num
而不是Ord
的stdlib类型,不可能存在不可订购的东西。@AdamSmithComplex
在标准库中,实现Num
,但不实现Ord
。(这是因为不可能生成一个具有ifa@DanielWagnerOrd
编码a的属性的Ord
实例,并且没有“合理的”复数的总顺序。你的是一个。你可以用abs number1>=abs offSet
而不是number1-offSet>=0
来概括offseter
,那么它就不需要总顺序了。@dirkt你说“你的是一个偏序”。但我没有说我的是什么。那么你怎么知道呢?你说“复数没有‘合理’的总顺序。”“合理”是什么意思?我猜你的意思是”它的性质是,ifa@DanielWagner dirkt谈论的是复数的性质,而不是总阶的性质。没有为复数定义总阶。这直接来自数学,与Haskell本身无关。有关“总阶”的更多信息,请参阅.Haskell中的Ord
类实现了总订单的数学属性。这很完美。您必须这样做,因为尽管(据我所知)没有任何stdlib类型可以实现Num
和Ord
,也不可能存在不可订购的Num
y。@AdamSmithComplex
在标准库中,实现Num
,但不实现Ord
。(这是因为不可能生成一个具有ifa@DanielWagnerOrd
编码a的属性的Ord
实例,并且没有“合理的”复数的总顺序。你的是一个。你可以用abs number1>=abs offSet
而不是number1-offSet>=0
来概括offseter
,那么它就不需要总顺序了。@dirkt你说“你的是一个偏序”。但我没有说我的是什么。那么你怎么知道呢?你说“复数没有‘合理’的总顺序。”“合理”是什么意思?我猜你的意思是”它的性质是,ifa@DanielWagner dirkt谈论的是复数的性质,而不是总阶的性质。没有为复数定义总阶。这直接来自数学,与Haskell本身无关。有关“总阶”的更多信息,请参阅.Haskell中的Ord
类实现了总订单的数学属性。