Dire qu'il y a des monades en Haskell, mais pas en OCaml, c'est un peu comme dire qu'il y a des design pattern en C++ mais pas en Java...
let concatMap f x = List.fold_left (@) [] (List.map f x);;
let return x = [x];;
let (>>=) v f = concatMap f v;;
let (>>) v f = let _ = concatMap f v in [];;
let test () =
[0;1;2;3;4;5] >>=
(fun x -> ["A";"B";"C";"D";"E"] >>=
(fun y -> return (x,y)));;
Et voila le travail.
Les monades, quand on code, c'est rien d'autre qu'une interface...
Et vu qu'OCaml a une couche objet, j'imagine qu'on peut même coder ça proprement, avec l'inférence de type qui se charge d'appeler les méthodes ">>=", ">>" et "return" correspondant à l'usage précis dans le code.
[^] # Re: typage mou
Posté par Axioplase ıɥs∀ (site web personnel) . En réponse à la dépêche Quelques nouvelles de Go, le langage de programmation. Évalué à 4.
let concatMap f x = List.fold_left (@) [] (List.map f x);;
let return x = [x];;
let (>>=) v f = concatMap f v;;
let (>>) v f = let _ = concatMap f v in [];;
let test () =
[0;1;2;3;4;5] >>=
(fun x -> ["A";"B";"C";"D";"E"] >>=
(fun y -> return (x,y)));;
Et voila le travail.
Les monades, quand on code, c'est rien d'autre qu'une interface...
Et vu qu'OCaml a une couche objet, j'imagine qu'on peut même coder ça proprement, avec l'inférence de type qui se charge d'appeler les méthodes ">>=", ">>" et "return" correspondant à l'usage précis dans le code.