Powiedzmy mam listę opcji:OCaml: wyższe polimorfizm kinded (abstrahując nad modułów?)
let opts = [Some 1; None; Some 4]
chciałbym przekształcić je w opcji z listy, tak że:
- Jeśli na liście znajduje się
None
, wynikiem jestNone
- W przeciwnym razie zbierane są różne int.
To stosunkowo proste napisać to w tym konkretnym przypadku (z użyciem Core i modułu Monad
):
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;;
Jednakże, jak sugeruje tytuł pytanie, ja naprawdę chciałbym streszczenie nad typem konstruktor, a nie specjalizuje się w Option
. Rdzeń wydaje się używać funktora, aby dać efekt wyższego rodzaju, ale nie wiem, w jaki sposób mogę napisać funkcję, która ma być wyodrębniona przez moduł. W Scali użyłbym niejawnego kontekstu, który wymagałby dostępności około Monad[M[_]]
. Spodziewam się, że nie ma możliwości niejawnego przejścia w module, ale jak mam to wyraźnie zrobić? Innymi słowy, czy mogę napisać coś w przybliżeniu:
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;;
Czy jest to coś, co można zrobić za pomocą modułów pierwszej klasy?
Edycja: Okay, więc nie przyszło mi do głowy, że próbuję użyć tego konkretnego kodu i wygląda na to, że jest bliższy pracy, niż się spodziewałem! Wydaje się, że składnia jest rzeczywiście ważne, ale uzyskać ten wynik:
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
Pierwsza część błędu wydaje się mylące, ponieważ pasują do siebie, więc zgaduję, problem jest z drugim - tu jest problem że wydaje się, że typ zwrotu nie jest określony? Przypuszczam, że zależy to od modułu, który jest przekazywany - czy to jest problem? Czy istnieje sposób naprawienia tej implementacji?
To stare pytanie może ci się przydać: http://stackoverflow.com/questions/1986374/higher-order-type-konstruktory-i -funektory-w-ocaml – rgrinberg