[Standard ML] 几个SML的小函数

今天做了 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,821评论 25 709
  • 前言 2017年6月9日晚,永澄老师在公众号的推文中,发布了《快思慢想》共读活动。 那天晚上,我刚好在和俊彦还有李...
    柠檬佳呀阅读 327评论 0 0
  • 上一章 警察故事 回到首章 目录 “我们在黑帮的卧底反映说有黑帮出于自己的狭隘心理,意图破坏下午6点在沙滩...
    过儿a阅读 234评论 1 1