3

I need to create a dictionary in sml, but I am having extreme difficulty with an insert function.

    type dict = string -> int option

As an example, here is the empty dictionary:

    val empty : dict = fn key => NONE

Here is my implementation of an insert function:

    fun insert (key,value) d = fn d => fn key => value

But this is of the wrong type, what I need is insert : (string*int) -> dict -> dict. I've searched everything from lazy functions to implementing dictionaries. Any help or direction would be greatly appreciateds!

If you are still confused on what I am trying to implement, I drafted up what I should expect to get when calling a simple lookup function

    fun lookup k d = d k

    - val d = insert ("foo",2) (insert ("bar",3) empty);
    val d = fn : string -> int option
    - lookup2 "foo" d;
    val it = SOME 2 : int option
    - lookup2 "bar" d;
    val it = SOME 3 : int option
    - lookup2 "baz" d;
    val it = NONE : int option
user44438
  • 35
  • 1
  • 4

1 Answers1

2

You can reason on the signature of the function:

val insert = fn: (string * int) -> dict -> dict

When you supply key, value and a dictionary d, you would like to get back a new dictionary d'. Since dict is string -> int option, d' is a function takes a string and returns an int option.

Suppose you supply a string s to that function. There are two cases which could happen: when s is the same as key you return the associated value, otherwise you return a value by looking up d with key s.

Here is a literal translation:

fun insert (key, value) d = fn s => if s = key then SOME value
                                    else d s
pad
  • 41,040
  • 7
  • 92
  • 166