2009-08-29 11 views
10

私はハスケルを学んで私の心を広げようとしています。タイプ・ダダクションはどのようにハスケルで動作しますか?

マイ自ら招い宿題は私にポアソン分布する間隔を与えるクロックティック・ジェネレータを構築することで、最終的な結果は、(長い闘いの後、私は認める)このでした:

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 

しかし、少なくとも私は理解できない2つのことがあります:

"Floating r"と同様に "Ord r"が必要なのはなぜですか? (私は何らかの自動継承を期待していたでしょう: "Floating"は "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で穏やかにしてください。

+2

IMHOこれは単なる自己学習であれば、私は宿題としてタグ付けしません。宿題の質問は非常に人工的な問題を意味し、一般的にあなたが好む場合を除いて、あなたが得る答えの種類を変えます(あなたのためにレイアウトするよりはるかにヒントです)。 – cletus

+0

@cletus:観察してくれてありがとう。私は現実世界の問題ではなく、これを運動として報告する方が良いと考えました。 –

+2

私は「宿題」ではなく「趣味」または「自己学習」とタグ付けします。 「宿題」は「現実世界ではない」ことを意味するものではなく、「本当に私に答えを与えてはいけません。 – Chuck

答えて

12

なぜ「オーダーr」と「フローティングr」が必要なのですか? (私は自動継承のいくつかの種類を期待しているだろう:「フローティング」「オード」を意味します。)

Floating

は複雑なものも含め、すべての浮動小数点数を分類することになっています。複素数の順序はありません。 Floatingの代わりに RealFloatを使用できます。これは Ordを意味します。

暗黙の型定義「rvalue :: Float」はどのようなパスですか?

これは、rvalueが使用されているコンテキストから推測できます。 、それはlogへの引数だ、と

:t log 

のでrvalueは(それがFloating型クラスでは「いくつかの種類ではなく、正確にFloatになります)Floatingクラスでなければなりません。さらに

log :: (Floating a) => a -> a 

を与えますlogの結果はその入力と同じ型であり、startrateの計算で使用され、rのすべてであるlimitと比較されますので、(rFloatingであるので、これは適切である)。

GHCiの例では、これ以上のコンテキストはありません。

:t random (mkStdGen 100) 

を入力これは、GHCiのがここaためで埋めるためにどのような種類を知らないあなたに

random (mkStdGen 100) :: (Random a) => (a, StdGen) 

を与えます。それは、それがtypeclass Randomになければならないことを知っているだけです。

+1

はい、もちろんです。フローティングには複雑な浮動小数点数が含まれている可能性があります。 RealFloatポインタをありがとう。 GHCiの動作を理解しました。私はちょうど私の機能の明らかにより自由な行動と対照的にそれを使用していました。 ご清聴ありがとうございました。 –

2

ハスケルでは、OrdとFloatingは独立しているか、orthogonalの概念です。おそらく、FloatingはDoubleやFloatのような非常に特殊な型しか参照していないと仮定していたでしょう(これは他の多くの言語でもそうです)。

Rudigerは、Complexのような特定の浮動小数点型には順序がないため、OrdではないFloatingクラスのインスタンスであると指摘しています。複素数以外の他の例として、ベクトルがありますが、これらの浮動関数を定義することはできますが、賢明なOrd-eringは定義できません。

タイプクラスは、タイプのために定義されなければならない関数の集合(JavaまたはC#のインタフェースのようなものです。 Ordであるためには、タイプは比較演算子を必要とし、Floatingのインスタンスでは、タイプは分数を実装し、関数pi、exp、sqrt、log、sin、cos、彼らのために定義されています。それはすべて浮動の手段であり、それ以上のものはありません。

+0

ありがとうございます。はい、私は直交性の概念に感謝します。私はそれをあまりにも小さなコンセプト空間に適用していました。 –

関連する問題