2016-07-24 42 views
0

(我是相當新的哈斯克爾,和函數式編程一般這樣可能會做的事情完全錯誤的)如何使用積分/分數的功能與民

我建立在Haskell一個謎,並已告知儘可能少的壓力是最好的(類型)。因此,而不是做一個積分類型,或分數類型的東西,我使用的是參數化類型:

data Orthotope a = Orthotope ... 

,並在幾乎所有的功能,我用的是類約束

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

然而,在一些特定的功能中,我需要劃分(和一次sqrt)。 我知道我可以使用(/)的分數,並DIV積分,(fromIntegral在需要的地方),甚至,我可以使用Data.Typeable來檢查它是,但都被告知,該幾乎總是完全錯誤的做法。

有沒有更好的方法來劃分和sqrt,對一個不完全知道的類型?或者這是我應該使用類型本身的測試的情況?

(我試圖找到一種方法,可以做一些也分數和積分',如果它適用於更多的類型,甚至更好(而不是使用較不普遍的類型))

謝謝。

回答

1

對支持它的類型進行「接近精確」的劃分並對只能表示整數的類型進行舍入除法的單個操作是其他語言中常見的錯誤來源。我建議你保持哈斯克爾的區別,通過對這兩類類型提供不同的操作,並強制用戶有意識地在舍入除法和更多標準除法之間進行選擇。

+0

一般來說,我完全同意,但在一個小型項目中,這仍然是真的,沒有別的東西會被使用?在這種情況下,通過選擇使用積分類型還是分數類型來完成選擇? (類型在程序中表示的是類型,如果向量空間的值,所以只使用積分數字是有意義的,但最終我可能會添加非近似形狀,然後可能需要Fractional,並且不更改基本代碼)謝謝 – ypw

+0

@ypw我不明白爲什麼我說的任何部分都應該是特定於大型程序的。 –

+1

@ypw每次我想我已經寫了一個足夠小的程序,以確保沒有錯誤,我爲自己的傲慢付出代價。 –

0

Floating將是支持sqrt和司的最普遍的類型。

你可以有ghci的告訴你,這通過定義同時使用,並且具有ghci的告訴你它的類型是什麼功能:

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

另外,請注意div是不完全一樣的/,因爲前者將結果舍入爲總是返回一個整數。