摘要:引言的模式匹配不強(qiáng)大但是也有一些應(yīng)用最近在利用業(yè)余周末時間斷續(xù)系統(tǒng)性的學(xué)我學(xué)習(xí)目的就是理解和掌握它的函數(shù)式編程,整體還沒學(xué)完??偟膩碚f這種方式優(yōu)點(diǎn)是靈活借助這種強(qiáng)大的自定義類型匹配系統(tǒng)可以簡化代碼結(jié)構(gòu)使代碼更易讀和維護(hù)。
引言
Destructure Objectjs的模式匹配不強(qiáng)大,但是也有一些應(yīng)用,最近在利用業(yè)余周末時間斷續(xù)系統(tǒng)性的學(xué)scala,我學(xué)習(xí)scala目的就是理解和掌握它的函數(shù)式編程,整體還沒學(xué)完。在這篇文章中會js結(jié)合scala的方式一起對比分析總結(jié)下,不說明默認(rèn)是js寫法。
let name; let {people:{age=Infinity,name}} = {people:{name:"JSDT"}} // name "JSDT"Array
let [a=1,b=2,c]=["a",] // a "a" 、 b 2 、c "undefined"Function
function JSDT([first,...rest]) { console.log(first,rest) } JSDT([1,2,3,4]); //1,[2,3,4]ADT(Algebraic Data Type)
上述本質(zhì)來說基于位置match,基礎(chǔ)且常用,scala中也有,比較基礎(chǔ),我不想重復(fù)枚舉了。在js中不支持自定義類型匹配,但是在模式匹配中這是重要一環(huán),由于最近在學(xué)scala,所以借鑒一下里面的思想和實(shí)現(xiàn)方式,因?yàn)槠湓峁〢DT方式的match。
原生類型(Scala)def acceptAny(x:Any):String={ x match { case s:String =>"a string" case i:Int if(i<20) => s"an int less than 20: $i" case _ => "don`t know" } } def main(args: Array[String]): Unit = { println(acceptAny(10)); //an int less than 20: 10 }自定義數(shù)據(jù)類型(scala)
case object Nil extends List[Nothing] case class Cons[+A](head: A, tail: List[A]) extends List[A] def sum(ints: List[Int]): Int = ints match { case Nil => 0 // 空list 返回0 case Cons(x,xs) => x + sum(xs) // recursive 求和 } val x = List(1,2,3,4,5) match { case Cons(x, Cons(2, Cons(4, _))) => x case Nil => 42 case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y case Cons(h, t) => h + sum(t) case _ => 101 } def main(args: Array[String]): Unit = { println( sum(List(1,2,3))) //6 println( x) //3 }
說明 為了搞明白和運(yùn)行這個例子研究了有好一會兒,書上(scala函數(shù)式編程Page:25)寫的沒問題,但是寫的不完整,我做了部分補(bǔ)充。
sum示例中模式匹配空構(gòu)造類型Nil和非空構(gòu)造類型Cons(由head和tail{tail由List構(gòu)成}構(gòu)成), 求和是通過遞歸的方式;
x match雖然case3、4、5都匹配,但是第一次匹配上的才會生效。
總的來說ADT這種方式優(yōu)點(diǎn)是靈活,借助這種強(qiáng)大的自定義類型匹配系統(tǒng),可以簡化代碼結(jié)構(gòu),使代碼更易讀和維護(hù)。
const ListOf = T => { var List = Type({ Nil:[], Cons:[T,List] }); return List; } const LoN = ListOf(Number); let list= LoN.Cons(1,LoN.Cons(2,LoN.Cons(3,LoN.Nil))); // let list= LoN.Cons(1); const sum = LoN.case({ Cons:(head,tail) => head + sum(tail), Nil:(x) => 0 }); console.log(sum(list)); //6
說明 js本身不支持adt的方式匹配,借助第三方工具union-type可以實(shí)現(xiàn),上述我寫了一個和scala sum模式匹配功能相同的match例子,由于是非原生,所以寫法上冗余,但其思想上和scala一樣,只是形式上不一樣。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/83504.html
閱讀 839·2023-04-26 00:13
閱讀 2859·2021-11-23 10:08
閱讀 2459·2021-09-01 10:41
閱讀 2125·2021-08-27 16:25
閱讀 4218·2021-07-30 15:14
閱讀 2372·2019-08-30 15:54
閱讀 872·2019-08-29 16:22
閱讀 2748·2019-08-26 12:13