はのは、私はオプションのリストを持っているとしましょう:のOCaml:高いkinded多型(?モジュールの上に抽象化)
let opts = [Some 1; None; Some 4]
私は、リストのオプションの中にこれらを変換したい、そのようなこと:
- リストに
None
が含まれている場合、結果はNone
- です。それ以外の場合は、さまざまなintが収集されます。私は本当に種類以上の抽象化したいのですが、質問のタイトルが示すとおり、
let sequence foo = let open Option in let open Monad_infix in List.fold ~init:(return []) ~f:(fun acc x -> acc >>= fun acc' -> x >>= fun x' -> return (x' :: acc') ) foo;;
しかし:
それは(Coreを使用してMonad
モジュール)は、この特定のケースのためにこれを書くことは比較的簡単ですコンストラクタではなく、Option
に特化しています。コアは、より親切な型の効果を与えるためにファンクタを使用しているようですが、モジュール上で抽象化される関数をどのように書くことができるかはわかりません。 Scalaでは、暗黙コンテキストを使用して、一部のMonad[M[_]]
の可用性を要求しています。暗黙的にモジュールを渡す方法はないと私は期待していますが、私はそれを明示的にどのようにしますか?言い換えれば、これに近似するものを書くことができます:
let sequence (module M : Monad.S) foo =
let open M in
let open M.Monad_infix in
List.fold ~init:(return []) ~f:(fun acc x ->
acc >>= fun acc' ->
x >>= fun x' ->
return (x' :: acc')
) foo;;
これはファーストクラスのモジュールで行うことができますか?
編集:さて、実際に私は特定のコードを試してみることはできませんでした。予想以上に機能しているようです。構文が実際に有効であるようだが、私はこの結果を得る:エラーの
Error: This expression has type 'a M.t but an expression was expected of type 'a M.t
The type constructor M.t would escape its scope
最初の部分は、それらが一致するので、混乱を招くようですので、私はこの問題を推測していることは秒であること - ここで問題です戻り値の型は決定されていないようですか?私はそれが渡されるモジュールに依存していると思います - これは問題ですか?この実装を修正する方法はありますか?
この古い質問はあなたにとって役に立ちます:http://stackoverflow.com/questions/1986374/higher-order-type-constructors-and-functors-in-ocaml – rgrinberg