如何使用Num的Integral / Fractional函数

时间:2016-07-24 13:16:27

标签: haskell types

(我对Haskell很新,对一般的函数式编程来说可能是完全错误的事情)

我正在Haskell中构建一个谜题,并且被告知尽可能强迫最好(类型)。因此,我没有使用 Integral 类型或 Fractional 类型,而是使用参数化类型:

data Orthotope a = Orthotope ...

在几乎所有函数中我都使用类约束

(Num a)=> ...
(Num a,Ord a)=> ...

然而,在某些特定功能中,我需要划分(并且一次是sqrt)。 我知道我可以使用(/)表示Fractional, div 表示Integral,(来自整数,需要),甚至我可以使用 Data.Typeable 检查它是什么,但是被告知这几乎总是完全错误的方法。

对于一种不完全已知的类型,是否有更好的划分方法和sqrt?或者这是我应该对类型本身使用测试的情况吗?

(我试图找到一种方法,能够对Fractional和Integral做一些事情,如果它适用于更多类型,甚至更好。(而不是使用不太通用的类型))

感谢。

2 个答案:

答案 0 :(得分:1)

进行单一操作,几乎完全符合"对支持它的类型进行划分,对只能表示整数的类型进行舍入 - 划分是其他语言中常见的错误来源。我建议你通过在这两类类型上提供不同的操作来保持Haskell的区别,并强迫用户有意识地在舍入除法和更标准的除法之间进行选择。

答案 1 :(得分:0)

Floating将是支持sqrt和分割的最常用类型。

你可以让ghci通过定义一个使用两者并且让ghci告诉你它的类型是什么的函数来告诉你这个:

ghci> let f x y = sqrt x / y
ghci> :t f
f :: Floating a => a -> a -> a

另请注意,div/不完全相同,因为前者将结果舍入为始终返回整数。