2013-12-11 22 views
9

Haskellで機能的依存関係を持つ動機は何ですか?機能依存の機能的依存関係を持つ動機

一つの例:それはRWH帳に記載されている

class (Monad m) => MonadSupply s m | m -> s where 
    next :: m (Maybe s) 

は、その機能依存性は、型チェッカーを支援します。それは実際にどう助けますか?

また、コードのこの作品は、実際にコンパイルされます。

class (Monad m) => MonadSupply s m where 
     next :: m (Maybe s) 

しかし、私は推測する、それが実行時エラーを生成します。

答えて

8

関数の依存関係を使わないコードを書いても問題ありませんが、推論がうまくいくので使用するのは単なる苦痛です。

基本的にFDがない場合、関数get :: MonadState m s => m sは、それぞれ独立してmsを把握する必要があります。通常mはかなり簡単に推論されますが、しばしばsには明示的な注釈が必要です。

また、これは我々が必要とするよりも、はるかに一般的なので、代わりに私たちは「mについては、正確に1 sがある」と言うために私たちの型チェッカー、このようにして、一度mが推測さを制限することができ、sは、型推論には自明ですアルゴリズム

+0

「mの場合、正確に1 sがあります」ということを理解できません。 'm'にちょうど' s'があると言うと、 'MonadSupply m m'と書いてみませんか? (私は狂っていると知っています:)) – Sibi

+0

@Sibi 's'は通常' MonadState'と異なり、 'StateT''と' s'を持っています。ただ 's'を使いたいだけです。 – jozefg

+0

与えられた "供給モナド"は、通常、1つのタイプのみを供給します!たとえば 's ='型の値を提供する 'm = MySpecialSupplyMonad s'を持っているなら、タイプ引数" 's'"を読むだけで型 "MySpecialSupplyMonad s'"型から供給型を知ることができます。したがって、 's'は機能的に' m'に依存していると言えます。 –

関連する問題