我通過一些在LYAH的例子讀,我碰到這個代碼片段來到之間使用:差異在預定義的類型類和基本類型
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
這是網絡版,但我也有一個這本書的副本,它有這個代替:
replicate' :: Int -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
我已經試過這兩個出來,他們都工作,但我的問題是:
這些是實現不同的,當笑我使用類型類而不是常規類型嗎?
'(Num,Ord)'太弱,無法確保理智的行爲。它應該可能要求'Integral'。 – dfeuer
@dfeuer:詳細說明一下,如果你使用複雜數字的集合,你需要一個實例Ord a = Ord(Complex a)'(可以說這是'Set'中的一個設計缺陷)並且那麼問題「複製(0:+ 1)foo」是什麼意思?「擡起頭來。法律concat。複製一個。複製b ===複製(a * b)'將會被打破,我想! – yatima2975
@ yatima2975,另一個值得關注的問題是「Num Double」和「Ord Double」的存在。我認爲還可以設想一種類型,表達與非標準分析(無限小)相關的想法,即使完全理智也可能對「複製」不利。 – dfeuer