15

Haskellでは、型クラスの制約を満たすM aようにモナドを制限する方法はありますか?a

確率的モデリングの例F#からHaskellに翻訳しています。ただし、Haskellではに変更されるので省略しましsupportた。この変更により、次のエラーが発生します。data Distribution adata (Ord a) => Distribution a

...probabilisticModeling.hs:42:13:
    Could not deduce (Ord a) from the context ()
      arising from a use of `always'
                   at ...probabilisticModeling.hs:42:13-18
    Possible fix:
      add (Ord a) to the context of the type signature for `return'
    In the expression: always
    In the definition of `return': return = always
    In the instance declaration for `Monad Distribution'

実際、always/のタイプreturnは次のとおり(Ord a) => a -> Distribution aです。モナドを持つことができる方法はありますが、このモナドDistributionに制約(Ord a)を強制しますか?私は試した:

instance Monad Distribution where
    (>>=) = bind
    return :: (Ord a) => a -> Distribution a = always

しかし、エラーが発生します:

...probabilisticModeling2.hs:48:4:
    Pattern bindings (except simple variables) not allowed in instance declarations
      return :: (Ord a) => a -> Distribution a = always
Failed, modules loaded: none.

したがって、モナドを持つ方法はありますが、 ?などの制約でM a制限します。aOrd a

ありがとう。

4

3 に答える 3

13

Haskell でよく知られた問題に遭遇したようです。「制限されたモナド」をグーグルで検索すると、多くの回避策が見つかりました。このソリューションは、混乱が最も少ないようです。それでも、私の目的では、それはやり過ぎのようです。Revolucent で提案されているように、モナドを一般的に保ち、制限された関数を介してサポートを簡素化すると思います。Distribution

于 2008-12-19T01:04:39.900 に答える
10

これについての私の理解では、モナドはすべての型に一般化されることを意図しているため、 などの型の制限されたサブセットではありません(Ord a)

モナド型を制限する代わりに、そのM aモナド型を使用する関数を単純に制限できます。

foo :: Ord a => Int -> M a

実際、型をできるだけ一般的なものに保ち、型クラスを使用して機能を制限することだけをお勧めします。

于 2008-12-18T22:53:42.410 に答える
3

Martin Erwig のライブラリ PFP をチェックしてください:

PFP ライブラリは、確率的関数型プログラミング、つまり確率値を使用したプログラミングを容易にする Haskell 用のモジュールのコレクションです。確率的関数型プログラミングのアプローチは、分布を表すデータ型に基づいています。分布は、可能性がタグ付けされたすべての可能な値のコレクションとして、確率的イベントの結果を表します。

于 2008-12-19T01:27:59.837 に答える