(我对Haskell很新,对一般的函数式编程来说可能是完全错误的事情)
我正在Haskell中构建一个谜题,并且被告知尽可能强迫最好(类型)。因此,我没有使用 Integral 类型或 Fractional 类型,而是使用参数化类型:
data Orthotope a = Orthotope ...
在几乎所有函数中我都使用类约束
(Num a)=> ...
(Num a,Ord a)=> ...
然而,在某些特定功能中,我需要划分(并且一次是sqrt)。 我知道我可以使用(/)表示Fractional, div 表示Integral,(来自整数,需要),甚至我可以使用 Data.Typeable 检查它是什么,但是被告知这几乎总是完全错误的方法。
对于一种不完全已知的类型,是否有更好的划分方法和sqrt?或者这是我应该对类型本身使用测试的情况吗?
(我试图找到一种方法,能够对Fractional和Integral做一些事情,如果它适用于更多类型,甚至更好。(而不是使用不太通用的类型))
感谢。
答案 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
与/
不完全相同,因为前者将结果舍入为始终返回整数。