File: list.sml

package info (click to toggle)
smlsharp 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 123,732 kB
  • sloc: ansic: 16,725; sh: 4,347; makefile: 2,191; java: 742; haskell: 493; ruby: 305; cpp: 284; pascal: 256; ml: 255; lisp: 141; asm: 97; sql: 74
file content (48 lines) | stat: -rw-r--r-- 1,126 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  datatype 'a parList = 
           NIL
         | CONS of 'a * index

  fun listInitialize cell L =
      case L of
        nil => cell NIL
      | h :: tail => 
        let
          val tailIndex = listInitialize cell tail
        in
          cell (CONS(h, tailIndex))
        end

  fun listInitialize (K: index -> index) cell L =
      case L of
        nil => K (cell NIL)
      | h :: tail => 
        let
          val newK = fn i => K (cell (CONS(h, i)))
        in
          listInitialize newK cell tail
        end

  fun listFinalize value =
      let
        fun conv i = 
            case value i of
              NIL => nil
            | CONS(head, tail) => head :: conv tail
      in
        conv
      end

  val whereParam = 
      {size = fn L => List.length L + 1,
       initialize = fn x => listInitialize (fn (x:index) => x) x,
       default = NIL,
       finalize = listFinalize}

 fun mapList f L = 
     _foreach id in L where whereParam
     with {value, newValue, size} 
     do case value id of
          NIL => NIL
        | CONS(head, tail)  => CONS(f head, tail)
     while false
     end