美文网首页
[Standard ML] 几个SML的小函数

[Standard ML] 几个SML的小函数

作者: 小翔 | 来源:发表于2017-10-13 21:54 被阅读0次

    今天做了 coursera: 程序设计语言 的第一章的作业。

    作业我就不放在这里了。但是我为了写作业,写了几个通用的小函数,放在这里备忘吧。


    函数们

    (*List的flatMap*)
    fun flatMap f xs = List.concat(map f xs)
    (*其实还有更贱兮兮的写法,最好到此为止,不要继续point free了*)
    fun flatMap f = List.concat o map f
    
    (*然后定义符号,infix相当于infixl*)
    infix 1 >>=
    fun xs >>= f = flatMap f xs
    
    (*List的scan*)
    fun scan f [] = []
      | scan f (x::xs) =
      let
        fun scan' init f [] = init :: []
          | scan' init f (x::xs) =
            let
              val next = f(init,x)
            in
              init :: scan' next f xs
            end
      in
        scan' x f xs
      end
    
    
    fun id x = x;
    
    (*依赖id*)
    fun range2(m:int, n:int) = let
        val a = Int.min(m,n)
        val b = Int.max(m,n)
        val f = if m<n then id else rev
        fun rang(p:int,q:int) = case q=p of
            true => []
          | false => p :: rang(p+1,q)
        in f(rang(a,b))
        end
    
    fun range x = List.tabulate(x, fn x => x)
    
    (* 依赖range *)
    fun findIndex f xs =
      let
        val len = length xs
        val indexes = range len
        val ixs  = ListPair.zipEq (indexes, xs)
        fun ff (i,x) = f x
        val ix = List.find ff ixs
        fun getI (i,x) = i
        val x = Option.map getI ix
      in
        x
      end
    
    fun removeDuplicates xs =
      let
        fun f(x,xs) = if(List.exists (fn i => x = i) xs) then xs else x::xs
      in
        rev(foldl f [] xs)
      end
    

    使用示例

    - range(0);
    val it = [] : int list
    - range(5);
    val it = [0,1,2,3,4] : int list
    
    
    - range2(1,3);
    val it = [1,2] : int list
    - range2(3,~1);
    val it = [2,1,0,~1] : int list
    
    
    - scan op+ [1,2,3];
    val it = [1,3,6] : int list
    - scan op+ [1,2,3,1,2];
    val it = [1,3,6,7,9] : int list
    - scan op+ [];
    val it = [] : int list
    - scan op+ [1];
    val it = [1] : int list
    
    
    - findIndex (fn x => x=3) [1,2,3];
    val it = SOME 2 : int option
    - findIndex (fn x => x=3) [];
    val it = NONE : int option
    - findIndex (fn x => x=3) [1,2,4];
    val it = NONE : int option
    

    相关文章

      网友评论

          本文标题:[Standard ML] 几个SML的小函数

          本文链接:https://www.haomeiwen.com/subject/czetuxtx.html