我試圖通過學習Haskell來擴大我的想法。類型扣除在Haskell中如何工作?
我自找的功課是建立一個時鐘滴答發生器,它會給我泊松分佈的時間間隔,而最終的結果(經過長期鬥爭,我承認)是這樣的:
import System.Random
poissonStream :: (Ord r, Random r, Floating r, RandomGen g) => r -> r -> r -> g -> [r]
poissonStream rate start limit gen
| next > limit = []
| otherwise = next:(poissonStream rate next limit newGen)
where (rvalue, newGen) = random gen
next = start - log(rvalue)/rate
但有兩件事(至少)我不明白:
爲什麼我需要「Ord r
」以及「Floating r
」? (我會期待某種自動繼承:「浮動」意味着「Ord」。)
通過什麼路徑隱含類型定義「rvalue :: Float
」實現? 在GHCI我得到了我本來期望:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100)
<interactive>:1:23:
Ambiguous type variable `t' in the constraint:
`Random t' arising from a use of `random' at <interactive>:1:23-43
Probable fix: add a type signature that fixes these type variable(s)
右值是一個鬆散的大炮,我有牽制:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100) :: (Float, StdGen)
*Main System.Random> rvalue
0.18520793
請溫柔與一個Haskell的n00b。
恕我直言,如果這只是自我學習,我不會把它標記爲家庭作業。家庭作業問題意味着一個非常人爲的問題,並且通常會改變你得到的答案的類型(更多的是提示而不是你自己),除非你喜歡這個。 – cletus 2009-08-29 15:38:16
@cletus:謝謝你的觀察。我認爲最好把它當做一個練習,而不是現實世界的問題。 – 2009-08-29 15:48:26
我會把它標爲「愛好」或「自學」而不是「作業」。 「家庭作業」並不意味着「不是真實世界」,而是「不真正給我答案」。 – Chuck 2009-08-29 16:00:05