или вызывает on_none, если значения нет. пробовал так:
let find_exn :
type a.
(module Map.S with type key = string) ->
key:string ->
on_none:(unit -> a) ->
??? ->
a =
fun (module S) ~key ~on_none map ->
match S.find_opt key map with Some value -> value | None -> on_none ()
но не понял что написать вместо ??? (тип параметра map)
a Map.S.t?
ну что-то такое делал и не вышло
Map.S это сигнатура; t нужен из модуля-аргумента. То есть, здесь нужно нечто вроде : (module Map.S with key = string and type 'a t = 'el 'map) -> 'el 'map -> on_none:(unit -> 'el) -> ..., но без higher-kinded полиморфизма на уровне типов так не выйдет. Аналогично и с монадами. Функтором можно выразить, только получится вербозно: module MakeFindExn (M : Map.S) = struct let run ~key ~on_none map = match M.find_opt key map with Some value -> value | None -> on_none () end А если modular explicits все же замержат, это можно будет красиво записать как let find_exn {M : Map.S} ~key ~on_none map = match M.find_opt key map with [...]
О, почти завтипы
Обсуждают сегодня