(*
Swift's closure
https://d...content-available-to-author-only...e.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
*)
load "Intmap"; (* for Moscow ML *)
fun unfoldr_string f b = case f b of
SOME (a, b') => a ^ (unfoldr_string f b')
| NONE => ""
fun unfoldl_string f b = case f b of
SOME (a, b') => (unfoldl_string f b') ^ a
| NONE => ""
val digitNames = foldr
(fn ((i, s), m) => Intmap.insert (m, i, s))
(Intmap.empty ())
[
(0, "Zero"), (1, "One"), (2, "Two"), (3, "Three"), (4, "Four"),
(5, "Five"), (6, "Six"), (7, "Seven"), (8, "Eight"), (9, "Nine")
]
val numbers = [16, 58, 510]
val strings = map
(
fn number => unfoldl_string
if num <= 0 then
NONE
else
SOME (
Intmap
.retrieve
(digitNames, num
mod 10) ^ output,
)
)
(number, "")
)
numbers
fun print_strings xs = (
(map (fn s => (print (s ^ "\n") ; ())) xs) ;
()
)
(****
$ mosml numbers-map-haskell.sml
Moscow ML version 2.01 (January 2004)
Enter `quit();' to quit.
[opening file "numbers-map-haskell.sml"]
> val it = () : unit
> val 'a unfoldr_string = fn : ('a -> (string * 'a) option) -> 'a -> string
val 'a unfoldl_string = fn : ('a -> (string * 'a) option) -> 'a -> string
val digitNames = <intmap> : string intmap
val numbers = [16, 58, 510] : int list
val strings = ["OneSix", "FiveEight", "FiveOneZero"] : string list
val print_strings = fn : string list -> unit
[closing file "numbers-map-haskell.sml"]
- print_strings strings;
OneSix
FiveEight
FiveOneZero
> val it = () : unit
-
****)
KCoKICAgIFN3aWZ0J3MgY2xvc3VyZQogICAgICAgIGh0dHBzOi8vZC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9Td2lmdC9Db25jZXB0dWFsL1N3aWZ0X1Byb2dyYW1taW5nX0xhbmd1YWdlL0Nsb3N1cmVzLmh0bWwKKikKCgpsb2FkICJJbnRtYXAiOyAgKCogZm9yIE1vc2NvdyBNTCAqKQoKCmZ1biB1bmZvbGRyX3N0cmluZyBmIGIgPSBjYXNlIGYgYiBvZgogICAgICBTT01FIChhLCBiJykgPT4gYSBeICh1bmZvbGRyX3N0cmluZyBmIGInKQogICAgfCBOT05FICAgICAgICAgPT4gIiIKCmZ1biB1bmZvbGRsX3N0cmluZyBmIGIgPSBjYXNlIGYgYiBvZgogICAgICBTT01FIChhLCBiJykgPT4gKHVuZm9sZGxfc3RyaW5nIGYgYicpIF4gYQogICAgfCBOT05FICAgICAgICAgPT4gIiIKCgp2YWwgZGlnaXROYW1lcyA9IGZvbGRyCiAgICAoZm4gKChpLCBzKSwgbSkgPT4gSW50bWFwLmluc2VydCAobSwgaSwgcykpCiAgICAoSW50bWFwLmVtcHR5ICgpKQogICAgWwogICAgICAgICgwLCAiWmVybyIpLCAoMSwgIk9uZSIpLCAoMiwgIlR3byIpLCAgICgzLCAiVGhyZWUiKSwgKDQsICJGb3VyIiksCiAgICAgICAgKDUsICJGaXZlIiksICg2LCAiU2l4IiksICg3LCAiU2V2ZW4iKSwgKDgsICJFaWdodCIpLCAoOSwgIk5pbmUiKQogICAgXQp2YWwgbnVtYmVycyA9IFsxNiwgNTgsIDUxMF0KCgp2YWwgc3RyaW5ncyA9IG1hcAogICAgKAogICAgICAgIGZuIG51bWJlciA9PiB1bmZvbGRsX3N0cmluZwogICAgICAgICAgICAoZm4gKG51bSwgb3V0cHV0KSA9PgogICAgICAgICAgICAgICAgaWYgbnVtIDw9IDAgdGhlbgogICAgICAgICAgICAgICAgICAgIE5PTkUKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTT01FICgKICAgICAgICAgICAgICAgICAgICAgICAgSW50bWFwLnJldHJpZXZlIChkaWdpdE5hbWVzLCBudW0gbW9kIDEwKSBeIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgKG51bSBkaXYgMTAsIG91dHB1dCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICAgICAgKG51bWJlciwgIiIpCiAgICApCiAgICBudW1iZXJzCgoKZnVuIHByaW50X3N0cmluZ3MgeHMgPSAoCiAgICAobWFwIChmbiBzID0+IChwcmludCAocyBeICJcbiIpIDsgKCkpKSB4cykgOwogICAgKCkKKQoKCgooKioqKgoKJCBtb3NtbCBudW1iZXJzLW1hcC1oYXNrZWxsLnNtbCAKTW9zY293IE1MIHZlcnNpb24gMi4wMSAoSmFudWFyeSAyMDA0KQpFbnRlciBgcXVpdCgpOycgdG8gcXVpdC4KW29wZW5pbmcgZmlsZSAibnVtYmVycy1tYXAtaGFza2VsbC5zbWwiXQo+IHZhbCBpdCA9ICgpIDogdW5pdAo+IHZhbCAnYSB1bmZvbGRyX3N0cmluZyA9IGZuIDogKCdhIC0+IChzdHJpbmcgKiAnYSkgb3B0aW9uKSAtPiAnYSAtPiBzdHJpbmcKICB2YWwgJ2EgdW5mb2xkbF9zdHJpbmcgPSBmbiA6ICgnYSAtPiAoc3RyaW5nICogJ2EpIG9wdGlvbikgLT4gJ2EgLT4gc3RyaW5nCiAgdmFsIGRpZ2l0TmFtZXMgPSA8aW50bWFwPiA6IHN0cmluZyBpbnRtYXAKICB2YWwgbnVtYmVycyA9IFsxNiwgNTgsIDUxMF0gOiBpbnQgbGlzdAogIHZhbCBzdHJpbmdzID0gWyJPbmVTaXgiLCAiRml2ZUVpZ2h0IiwgIkZpdmVPbmVaZXJvIl0gOiBzdHJpbmcgbGlzdAogIHZhbCBwcmludF9zdHJpbmdzID0gZm4gOiBzdHJpbmcgbGlzdCAtPiB1bml0CltjbG9zaW5nIGZpbGUgIm51bWJlcnMtbWFwLWhhc2tlbGwuc21sIl0KLSBwcmludF9zdHJpbmdzIHN0cmluZ3M7Ck9uZVNpeApGaXZlRWlnaHQKRml2ZU9uZVplcm8KPiB2YWwgaXQgPSAoKSA6IHVuaXQKLQoKKioqKik=