[Standard ML] 幾個SML的小函數(shù)

今天做了 coursera: 程序設計語言 的第一章的作業(yè)妓羊。

作業(yè)我就不放在這里了绊起。但是我為了寫作業(yè)腔彰,寫了幾個通用的小函數(shù)芍阎,放在這里備忘吧世曾。


函數(shù)們

(*List的flatMap*)
fun flatMap f xs = List.concat(map f xs)
(*其實還有更賤兮兮的寫法,最好到此為止,不要繼續(xù)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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轮听,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岭佳,更是在濱河造成了極大的恐慌血巍,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊随,死亡現(xiàn)場離奇詭異述寡,居然都是意外死亡,警方通過查閱死者的電腦和手機叶洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門鲫凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衩辟,你說我怎么就攤上這事螟炫。” “怎么了艺晴?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵昼钻,是天一觀的道長。 經(jīng)常有香客問我封寞,道長然评,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任狈究,我火速辦了婚禮沾瓦,結果婚禮上,老公的妹妹穿的比我還像新娘谦炒。我一直安慰自己,他們只是感情好风喇,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布宁改。 她就那樣靜靜地躺著,像睡著了一般魂莫。 火紅的嫁衣襯著肌膚如雪还蹲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音谜喊,去河邊找鬼潭兽。 笑死,一個胖子當著我的面吹牛斗遏,可吹牛的內(nèi)容都是我干的山卦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼诵次,長吁一口氣:“原來是場噩夢啊……” “哼账蓉!你這毒婦竟也來了?” 一聲冷哼從身側響起逾一,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铸本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遵堵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱玷,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年陌宿,在試婚紗的時候發(fā)現(xiàn)自己被綠了锡足。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡限番,死狀恐怖舱污,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弥虐,我是刑警寧澤扩灯,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站霜瘪,受9級特大地震影響珠插,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颖对,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一捻撑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缤底,春花似錦顾患、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徙歼,卻和暖如春犁河,著一層夾襖步出監(jiān)牢的瞬間鳖枕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工桨螺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宾符,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓灭翔,卻偏偏與公主長得像魏烫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缠局,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理则奥,服務發(fā)現(xiàn),斷路器狭园,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 前言 2017年6月9日晚读处,永澄老師在公眾號的推文中,發(fā)布了《快思慢想》共讀活動唱矛。 那天晚上罚舱,我剛好在和俊彥還有李...
    檸檬佳呀閱讀 293評論 0 0
  • 上一章 警察故事 回到首章 目錄 “我們在黑幫的臥底反映說有黑幫出于自己的狹隘心理,意圖破壞下午6點在沙灘...
    過兒a閱讀 230評論 1 1