С помощью функции let или локальной привязки и теневого копирования вы можете объявить функцию, а затем присвоить ей значение.
для этого удобнее использовать local, поскольку она имеет вид: local decl in decl end, а не let decl in expr end, что означает, что expr , хочет получитьаргумент уровня f
val map = fn f => let fun map = ... in map end
Я не верю, что люди обычно используют local , в основном потому, что модули могут делать все, что может локально, и даже больше, но, возможно,стоит рассматривать его как анонимный модуль, когда вы еще не хотите объяснять модули.
local
fun map (f : 'a -> 'b) (x::rest : 'a list) : 'b list
= f x :: map f rest
| map _ ([]) = []
in
val (map : ('a -> 'b) -> 'a list -> 'b list) = map;
end
Затем, когда придет время объяснять модули, вы можете объявить структуру внутри локальной, вокруг всехобъявления, а затем удалить локальные, и попытаться придумать ситуацию, когда они закодировали 2 функции, и более уместно заменить 2 локальных, с 1 структурой.
local
structure X = struct
fun id x = x
end
in val id = X.id
end
возможно, запуск ихс чем-тог как следующее:
exception ReplaceSorryWithYourAnswer
fun sorry () = raise ReplaceSorryWithYourAnswer
local
(* Please fill in the _'s with the arguments
and the call to sorry() with your answer *)
fun map _ _ = sorry ()
in
val map : ('a -> 'b) -> ('a list) -> ('b list) = map
end