Function Haskell泛型

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

所以我刚开始学习Haskell,我已经在这上面呆了很长时间了。所以我有一个函数,在偏移量为负数(最小值为0)后计算一个数字。我用显式显示的类型实现了这个函数

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类型,不可能存在不可订购的东西。@AdamSmith
Complex
在标准库中,实现
Num
,但不实现
Ord
。(这是因为不可能生成一个具有if
a@DanielWagner
Ord
编码a的属性的
Ord
实例,并且没有“合理的”复数的总顺序。你的是一个。你可以用
abs number1>=abs offSet
而不是
number1-offSet>=0
来概括
offseter
,那么它就不需要总顺序了。@dirkt你说“你的是一个偏序”。但我没有说我的是什么。那么你怎么知道呢?你说“复数没有‘合理’的总顺序。”“合理”是什么意思?我猜你的意思是”它的性质是,if
a@DanielWagner dirkt谈论的是复数的性质,而不是总阶的性质。没有为复数定义总阶。这直接来自数学,与Haskell本身无关。有关“总阶”的更多信息,请参阅.Haskell中的
Ord
类实现了总订单的数学属性。这很完美。您必须这样做,因为尽管(据我所知)没有任何stdlib类型可以实现
Num
Ord
,也不可能存在不可订购的
Num
y。@AdamSmith
Complex
在标准库中,实现
Num
,但不实现
Ord
。(这是因为不可能生成一个具有if
a@DanielWagner
Ord
编码a的属性的
Ord
实例,并且没有“合理的”复数的总顺序。你的是一个。你可以用
abs number1>=abs offSet
而不是
number1-offSet>=0
来概括
offseter
,那么它就不需要总顺序了。@dirkt你说“你的是一个偏序”。但我没有说我的是什么。那么你怎么知道呢?你说“复数没有‘合理’的总顺序。”“合理”是什么意思?我猜你的意思是”它的性质是,if
a@DanielWagner dirkt谈论的是复数的性质,而不是总阶的性质。没有为复数定义总阶。这直接来自数学,与Haskell本身无关。有关“总阶”的更多信息,请参阅.Haskell中的
Ord
类实现了总订单的数学属性。