FïŒã§é¢æ°åããã°ã©ãã³ã°ã«é¢ããäžé£ã®èšäºãç¶ããŸãã 仿¥ãéåžžã«è峿·±ããããã¯ããããŸãïŒé¢æ°ã®å®çŸ©ã§ãã å«ããŠãå¿å颿°ããã©ã¡ãŒã¿ãŒã®ãªã颿°ãååž°é¢æ°ãã³ã³ãããŒã¿ãŒãªã©ã«ã€ããŠè©±ããŸãããã ç«ã®äžãèŠãŠãã ããïŒ

颿°å®çŸ©
ãletãæ§æã䜿çšããŠéåžžã®é¢æ°ãäœæããæ¹æ³ã¯æ¢ã«ç¥ã£ãŠããŸãã
let add xy = x + y
ãã®èšäºã§ã¯ã颿°ãäœæããä»ã®æ¹æ³ãšãããããå®çŸ©ããããã®ãã³ããèŠãŠãããŸãã
ç¡å颿°ïŒã©ã ãïŒ
ä»ã®èšèªã®ã©ã ãã«ç²ŸéããŠããå Žåã以äžã®æ®µèœã¯ããªãã¿ã®ããã«æããŸãã ç¡å颿°ïŒãŸãã¯ãã©ã ãåŒãïŒã¯ã次ã®ããã«å®çŸ©ãããŸãã
fun parameter1 parameter2 etc -> expression
CïŒã®ã©ã ããšæ¯èŒãããšã2ã€ã®éãããããŸãã
- ã©ã ãã¯
fun
ããŒã¯ãŒãã§å§ãŸãå¿
èŠããããŸãããããã¯CïŒã§ã¯å¿
èŠãããŸãã - CïŒã®double
=>
代ããã«ãåäžç¢å°->
䜿çšãããŸãã
å ç®é¢æ°ã®ã©ã ãå®çŸ©ïŒ
let add = fun xy -> x + y
åŸæ¥ã®åœ¢åŒã®åãæ©èœïŒ
let add xy = x + y
ã©ã ãã¯ãå°ããªåŒã®åœ¢ã§ããŸãã¯åŒã«å¥ã®é¢æ°ãå®çŸ©ããå¿
èŠããªãå Žåã«ãã䜿çšãããŸãã ãã§ã«èŠãããã«ããªã¹ããæäœãããšããããã¯çããããšã§ã¯ãããŸããã
// let add1 i = i + 1 [1..10] |> List.map add1 // [1..10] |> List.map (fun i -> i + 1)
ã©ã ãã®åšãã«æ¬åŒ§ã䜿çšããå¿
èŠãããããšã«æ³šæããŠãã ããã
ã©ã ãã¯ãæããã«ç°ãªãæ©èœãå¿
èŠãªå Žåã«ã䜿çšãããŸãã ããšãã°ãåã«èª¬æããã adderGenerator
ãã¯ãã©ã ãã䜿çšããŠæžãæããããšãã§ããŸãã
// let adderGenerator x = (+) x // let adderGenerator x = fun y -> x + y
ã©ã ãããŒãžã§ã³ã¯å°ãé·ããªããŸãããäžé颿°ãè¿ãããããšãããã«ããããŸãã
ã©ã ãã¯ãã¹ãã§ããŸãã adderGenerator
å®çŸ©ã®å¥ã®äŸãä»åã¯ã©ã ãã®ã¿ã
let adderGenerator = fun x -> (fun y -> x + y)
3ã€ã®å®çŸ©ãã¹ãŠãåçã§ããããšã¯æããã§ããïŒ
let adderGenerator1 xy = x + y let adderGenerator2 x = fun y -> x + y let adderGenerator3 = fun x -> (fun y -> x + y)
ããã§ãªãå Žåã¯ã ã«ãªãŒåã«é¢ããç« ãèªã¿çŽããŠãã ããã ããã¯çè§£ããããã«éåžžã«éèŠã§ãïŒ
ãã¿ãŒã³ãããã³ã°
颿°ãå®çŸ©ããããšãäžã®äŸã®ããã«æç€ºçã«ãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããŸããããã©ã¡ãŒã¿ãŒã»ã¯ã·ã§ã³ã§ãã³ãã¬ãŒããšçŽæ¥æ¯èŒããããšãã§ããŸãã ã€ãŸãããã©ã¡ãŒã¿ã»ã¯ã·ã§ã³ã«ã¯ãèå¥åã ãã§ãªãããã¿ãŒã³ïŒäžèŽãããã¿ãŒã³ïŒãå«ãŸããŠããå¯èœæ§ããããŸãã
次ã®äŸã¯ã颿°å®çŸ©ã§ã®ãã¿ãŒã³ã®äœ¿çšã瀺ããŠããŸãã
type Name = {first:string; last:string} // let bob = {first="bob"; last="smith"} // // let f1 name = // let {first=f; last=l} = name // printfn "first=%s; last=%s" fl // let f2 {first=f; last=l} = // printfn "first=%s; last=%s" fl // f1 bob f2 bob
ãã®ã¿ã€ãã®äžèŽã¯ãäžèŽãåžžã«è§£æ±ºå¯èœãªå Žåã«ã®ã¿çºçããŸãã ããšãã°ãå Žåã«ãã£ãŠã¯ç
§åã§ããªãããããã®æ¹æ³ã§ã¯ãŠããªã³ã¿ã€ããšãªã¹ããç
§åã§ããŸããã
let f3 (x::xs) = // printfn "first element is=%A" x
ã³ã³ãã€ã©ãŒã¯ãäžå®å
šãªãããã³ã°ã«é¢ããèŠåãåºããŸãïŒç©ºã®ãªã¹ãã¯ããã®é¢æ°ã®å
¥ãå£ã§ã©ã³ã¿ã€ã ã«ãšã©ãŒãåŒãèµ·ãããŸãïŒã
ããããééãïŒã¿ãã«vs. å€ãã®ãã©ã¡ãŒã¿
Cã©ã€ã¯ãªèšèªããæ¥ãå Žåã颿°ã®å¯äžã®åŒæ°ãšããŠäœ¿çšãããã¿ãã«ã¯ããã«ããã©ã¡ãŒã¿ãŒé¢æ°ã«éåžžã«äŒŒãŠããå¯èœæ§ããããŸãã ããããããã¯åããã®ã§ã¯ãããŸããïŒ åè¿°ããããã«ãã³ã³ãã衚瀺ãããå Žåãããã¯ããããã¿ãã«ã§ãã ãã©ã¡ãŒã¿ãŒã¯ã¹ããŒã¹ã§åºåãããŸãã
æ··ä¹±ã®äŸïŒ
// let addTwoParams xy = x + y // - let addTuple aTuple = let (x,y) = aTuple x + y // // let addConfusingTuple (x,y) = x + y
- æåã®å®çŸ©ã
addTwoParams
ãã¯ãã¹ããŒã¹ã§åºåããã2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã - 2çªç®ã®å®çŸ©ã
addTuple
ãã¯ã1ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯ãã¿ãã«ãããxããšãyãããã€ã³ãããããããåèšããŸãã - 3çªç®ã®å®çŸ©ã
addConfusingTuple
ãã¯ãã addConfusingTuple
ãã®ãããªåäžã®ãã©ã¡ãŒã¿ãŒãåããŸãããããªãã¯ã¯ããã®ã¿ãã«ãè§£åããïŒãã¿ãŒã³ã«äžèŽïŒããã¿ãŒã³ãããã³ã°ã䜿çšããŠãã©ã¡ãŒã¿ãŒå®çŸ©ã®äžéšãšããŠãã€ã³ããããããšã§ãã èå°è£ã§ã¯ããã¹ãŠãaddTuple
ãšãŸã£ããåãããã«addTuple
ãŸãã
眲åãèŠãŠã¿ãŸãããïŒäœãããããªãå Žåã¯ãåžžã«çœ²åãèŠãŠãã ããïŒã
val addTwoParams : int -> int -> int // val addTuple : int * int -> int // tuple->int val addConfusingTuple : int * int -> int // tuple->int
ãããŠä»ããã«ïŒ
// addTwoParams 1 2 // ok -- addTwoParams (1,2) // error - // => error FS0001: This expression was expected to have type // int but here has type 'a * 'b
ããã§ã¯ã2çªç®ã®åŒã³åºãã§ãšã©ãŒã衚瀺ãããŸãã
æåã«ãã³ã³ãã€ã©ã¯(1,2)
ã('a * 'b)
圢åŒã®äžè¬åã¿ãã«ãšããŠæ±ããŸããããã¯ãã addTwoParams
ãã®æåã®ãã©ã¡ãŒã¿ãšããŠæž¡ãããšããŸãã ãã®åŸãæåŸ
ãããæåã®ãã©ã¡ãŒã¿ãŒaddTwoParams
int
ã§addTwoParams
ãªãããã¿ãã«ãæž¡ã詊ã¿ãè¡ããããšæå¥ãèšããŸãã
ã¿ãã«ãäœæããã«ã¯ãã³ã³ãã䜿çšããŠãã ããïŒ
addTuple (1,2) // ok addConfusingTuple (1,2) // ok let x = (1,2) addTuple x // ok let y = 1,2 // , // ! addTuple y // ok addConfusingTuple y // ok
éã«ãã¿ãã«ãåŸ
æ©ããŠãã颿°ã«è€æ°ã®åŒæ°ãæž¡ããšãçè§£ã§ããªããšã©ãŒãçºçããŸãã
addConfusingTuple 1 2 // error -- // => error FS0003: This value is not a function and // cannot be applied
ä»åãã³ã³ãã€ã©ã¯ã2ã€ã®åŒæ°ãaddConfusingTuple
ãaddConfusingTuple
ã addConfusingTuple
ãã«ãªãŒåããããšã決å®ããŸããã ãšã³ããªã addConfusingTuple 1
ãã¯éšåçãªã¢ããªã±ãŒã·ã§ã³ã§ãããäžé颿°ãè¿ãå¿
èŠããããŸãã ãã©ã¡ãŒã¿ãŒã2ãã§ãã®äžé颿°ãåŒã³åºãããšãããšããšã©ãŒãã¹ããŒãããŸãã äžéæ©èœã¯ãããŸããïŒ ã«ãªãŒåã®ç« ãšåããšã©ãŒã衚瀺ãããŸããã«ãªãŒåã§ã¯ããã©ã¡ãŒã¿ãŒãå€ãããåé¡ã«ã€ããŠèª¬æããŸããã
ã¿ãã«ããã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããªãã®ã¯ãªãã§ããïŒ
äžèšã®ã¿ãã«ã®èª¬æã¯ãå€ãã®ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ãå®çŸ©ããå¥ã®æ¹æ³ã瀺ããŠããŸããããããåå¥ã«æž¡ã代ããã«ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã1ã€ã®æ§é ã«ã¢ã»ã³ãã«ã§ããŸãã 以äžã®äŸã§ã¯ã颿°ã¯1ã€ã®ãã©ã¡ãŒã¿ãŒïŒ3ã€ã®èŠçŽ ã®ã¿ãã«ïŒãåããŸãã
let f (x,y,z) = x + y * z // - int * int * int -> int // f (1,2,3)
眲åã¯ã3ã€ã®ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã®çœ²åãšã¯ç°ãªãããšã«æ³šæããŠãã ããã ã¿ãã«(int*int*int)
æãç¢å°ããã©ã¡ãŒã¿ãŒãã¢ã¹ã¿ãªã¹ã¯ã¯1ã€ã ãã§ãã
å¥ã
ã®ãã©ã¡ãŒã¿ãŒã§åŒæ°ãéä¿¡ããå¿
èŠãããå Žåãããã³ã¿ãã«ã§éä¿¡ããå Žå
- ã¿ãã«èªäœãéèŠãªå Žåã ããšãã°ã3次å
空éã§ã®æäœã®å Žåã3çµã®ã¿ãã«ã¯3ã€ã®åº§æšãå¥ã
ã«äœ¿çšããããã䟿å©ã§ãã
- ã¿ãã«ã䜿çšããŠãäžç·ã«æ ŒçŽããå¿
èŠã®ããããŒã¿ãåäžã®æ§é ã«çµåããå ŽåããããŸãã ããšãã°ã.NETã©ã€ãã©ãªã®
TryParse
ã¡ãœããã¯ãçµæãšããŒã«å€æ°ãã¿ãã«ãšããŠè¿ããŸãã ããããå€ãã®é¢é£ããŒã¿ãä¿åããã«ã¯ãã¯ã©ã¹ãŸãã¯ã¬ã³ãŒãïŒ recordãå®çŸ©ããæ¹ãè¯ãã§ãããã
ç¹å¥ãªå ŽåïŒ.NETã©ã€ãã©ãªã®ã¿ãã«ãšé¢æ°
.NETã©ã€ãã©ãªãåŒã³åºããšããã³ã³ãã¯éåžžã«äžè¬çã§ãïŒ
ãããã¯ãã¹ãŠã¿ãã«ãåãå
¥ããåŒã³åºãã¯CïŒãšåãããã«èŠããŸãã
// System.String.Compare("a","b") // System.String.Compare "a" "b"
ãã®çç±ã¯ãåŸæ¥ã®.NETã®æ©èœã¯ã«ãªãŒåãããŠããããéšåçã«é©çšã§ããªãããã§ãã ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯åžžã«ããã«éä¿¡ããå¿
èŠããããæãæçœãªæ¹æ³ã¯ã¿ãã«ã䜿çšããããšã§ãã
ãããã®åŒã³åºãã¯ã¿ãã«ã転éããããã«èŠããã ãã§ãããããã¯å®éã«ã¯ç¹å¥ãªå Žåã§ãã ãã®ãããªé¢æ°ã«å®éã®ã¿ãã«ãæž¡ãããšã¯ã§ããŸããã
let tuple = ("a","b") System.String.Compare tuple // error System.String.Compare "a","b" // error
.NET颿°ãéšåçã«é©çšããå Žåã¯ã 以åã«è¡ã£ãããã« ããŸãã¯ä»¥äžã«ç€ºãããã«ããããã«ã©ãããŒãæžãã ãã§ãã
// let strCompare xy = System.String.Compare(x,y) // let strCompareWithB = strCompare "B" // ["A";"B";"C"] |> List.map strCompareWithB
åå¥ããã³ã°ã«ãŒãåããããã©ã¡ãŒã¿ãŒã®éžæã¬ã€ã
ã¿ãã«ã®èª¬æã¯ãããäžè¬çãªãããã¯ã«ã€ãªãããŸãããã©ã¡ãŒã¿ããã€åé¢ããããã°ã«ãŒãåãããã§ãã
ãã®ç¹ã§ãFïŒãšCïŒã®éãã«æ³šæããå¿
èŠããããŸãã CïŒã§ã¯ã ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãåžžã«æž¡ãããããããã®è³ªåã¯ããã§ãçºçããŸããïŒ FïŒã§ã¯ãéšåçã«é©çšãããããããã©ã¡ãŒã¿ãŒã®äžéšã®ã¿ã衚ãããšãã§ããããããã©ã¡ãŒã¿ãŒãçµã¿åãããå¿
èŠãããå Žåãšãç¬ç«ããŠããå Žåãåºå¥ããå¿
èŠããããŸãã
ç¬èªã®é¢æ°ãèšèšããéã®ãã©ã¡ãŒã¿ãŒã®æ§ææ¹æ³ã«é¢ããäžè¬çãªæšå¥šäºé
ã
- äžè¬çãªã±ãŒã¹ã§ã¯ãã¿ãã«ã§ããã¬ã³ãŒãã§ããã1ã€ã®æ§é äœãæž¡ãã®ã§ã¯ãªããåå¥ã®ãã©ã¡ãŒã¿ãŒã䜿çšããããšããå§ãããŸãã ããã«ãããéšåé©çšãªã©ãããæè»ãªåäœãå¯èœã«ãªããŸãã
- ãã ãããã©ã¡ãŒã¿ã®ã°ã«ãŒããäžåºŠã«æž¡ãå¿
èŠãããå Žåã¯ãäœããã®ã°ã«ãŒãåã¡ã«ããºã ã䜿çšããå¿
èŠããããŸãã
ã€ãŸãã颿°ãéçºãããšããããã®ãã©ã¡ãŒã¿ãŒãåå¥ã«æäŸã§ããŸããïŒããšèªåããŠãã ããã çãããããã®å Žåããã©ã¡ãŒã¿ãŒãã°ã«ãŒãåããå¿
èŠããããŸãã
ããã€ãã®äŸãèŠãŠã¿ãŸãããã
// . // , let add xy = x + y // // , let locateOnMap (xCoord,yCoord) = // // // - type CustomerName = {First:string; Last:string} let setCustomerName aCustomerName = // let setCustomerName first last = // // // // , let setCustomerName myCredentials aName = //
æåŸã«ããã©ã¡ãŒã¿ã®é åºãéšåçãªé©çšã«åœ¹ç«ã€ããšã確èªããŠãã ããïŒãã¡ãã®ããã¥ã¢ã«ãåç
§ããŠãã ãã ïŒã ããšãã°ãæåŸã®é¢æ°ã§myCredentials
åã«aName
ãé
眮ããã®ã¯ãªãã§ããïŒ
ãã©ã¡ãŒã¿ãªãã®é¢æ°
ãã©ã¡ãŒã¿ãŒãåãå
¥ããªã颿°ãå¿
èŠã«ãªãå ŽåããããŸãã ããšãã°ãè€æ°ååŒã³åºãããšãã§ãããhello worldã颿°ãå¿
èŠã§ãã åã®ã»ã¯ã·ã§ã³ã§ç€ºããããã«ãåçŽãªå®çŸ©ã¯æ©èœããŸããã
let sayHello = printfn "Hello World!" //
ãã ããããã¯ããŠããããã©ã¡ãŒã¿ãŒã颿°ã«è¿œå ããããã©ã ãã䜿çšããããšã§ä¿®æ£ã§ããŸãã
let sayHello() = printfn "Hello World!" // let sayHello = fun () -> printfn "Hello World!" //
ãã®åŸã颿°ã¯åžžã«unit
åŒæ°ã§åŒã³åºãããå¿
èŠããããŸãã
// sayHello()
.NETã©ã€ãã©ãªãšããåããããšãã«é »ç¹ã«èµ·ããããšïŒ
Console.ReadLine() System.Environment.GetCommandLineArgs() System.IO.Directory.GetCurrentDirectory()
èŠããŠãããŠãããããunit
ãã©ã¡ãŒã¿ã§åŒã³åºããŸãïŒ
æ°ããæŒç®åã®å®çŸ©
1ã€ä»¥äžã®æŒç®åæåã䜿çšããŠé¢æ°ãå®çŸ©ã§ããŸãïŒæåã®ãªã¹ãã«ã€ããŠã¯ããã¥ã¡ã³ããåç
§ããŠãã ããïŒã
// let (.*%) xy = x + y + 1
颿°ãå®çŸ©ããã«ã¯ãæåãæ¬åŒ§ã§å²ãå¿
èŠããããŸãã
*
å§ãŸãæŒç®åã«ã¯ãæ¬åŒ§ãš*
éã«ã¹ããŒã¹ãå¿
èŠã§ãã FïŒ (*
ã¯ã³ã¡ã³ãã®å§ãŸããšããŠæ©èœããŸãïŒCïŒã®/*...*/
ãªã©ïŒïŒ
let ( *+* ) xy = x + y + 1
å®çŸ©åŸãè§æ¬åŒ§ã§å²ãŸããŠããå Žåãæ°ãã颿°ã¯éåžžã®æ¹æ³ã§äœ¿çšã§ããŸãã
let result = (.*%) 2 3
颿°ã2ã€ã®ãã©ã¡ãŒã¿ãŒã§äœ¿çšãããå Žåããã£ããªãã§äžçœ®æŒç®åã¬ã³ãŒãã䜿çšã§ããŸãã
let result = 2 .*% 3
!
å§ãŸããã¬ãã£ãã¯ã¹æŒç®åãå®çŸ©ããããšãã§ããŸã ãŸãã¯~
ïŒããã€ãã®å¶éä»ãã ããã¥ã¡ã³ããåç
§ïŒ
let (~%%) (s:string) = s.ToCharArray() // let result = %% "hello"
FïŒã§ã¯ãã¹ããŒãã¡ã³ãã®å®çŸ©ã¯ããªãäžè¬çãªæäœã§ãããå€ãã®ã©ã€ãã©ãªã¯>=>
ã<*>
ãããªååã®ã¹ããŒãã¡ã³ãããšã¯ã¹ããŒãããŸãã
ãã€ã³ãããªãŒã¹ã¿ã€ã«
ã«ãªã¹ã®ã¬ãã«ãäžããããã®ææ°ã®ãã©ã¡ãŒã¿ãŒãæ¬ ããŠãã颿°ã®äŸã¯ããã§ã«å€ãèŠãŠããŸãã ãã®ã¹ã¿ã€ã«ã¯ã ãã€ã³ãããªãŒã¹ã¿ã€ã«ãŸãã¯æé»ããã°ã©ãã³ã°ãšåŒã°ããŸã ã
以äžã«äŸã瀺ããŸãã
let add xy = x + y // let add x = (+) x // point free let add1Times2 x = (x + 1) * 2 // let add1Times2 = (+) 1 >> (*) 2 // point free let sum list = List.reduce (fun sum e -> sum+e) list // let sum = List.reduce (+) // point free
ãã®ã¹ã¿ã€ã«ã«ã¯é·æãšçæããããŸãã
å©ç¹ã®1ã€ã¯ãäœã¬ãã«ã®ãªããžã§ã¯ãã«ç
©ããããã®ã§ã¯ãªãã髿¬¡é¢æ°ã®æ§æã«éç¹ã眮ãããŠããããšã§ãã ããšãã°ãã (+) 1 >> (*) 2
ãã¯ãæç€ºçãªå ç®ãšããã«ç¶ãä¹ç®ã§ãã ãŸããã List.reduce (+)
ãã¯ããªã¹ãæ
å ±ã«é¢ä¿ãªããè¿œå æäœãéèŠã§ããããšãæç¢ºã«ããŸãã
ç¡æå³ãªã¹ã¿ã€ã«ã䜿çšãããšãåºæ¬çãªã¢ã«ãŽãªãºã ã«éäžããã³ãŒãå
ã®äžè¬çãªæ©èœãç¹å®ã§ããŸãã äžèšã§äœ¿çšããã reduce
ã颿°ã¯è¯ãäŸã§ãã ãã®ãããã¯ã«ã€ããŠã¯ããªã¹ãåŠçã«é¢ããäžé£ã®èšç»ã§èª¬æããŸãã
äžæ¹ããã®ã¹ã¿ã€ã«ã䜿ãããããšãã³ãŒããäžæçã«ãªãå¯èœæ§ããããŸãã æç€ºçãªãã©ã¡ãŒã¿ã¯ããã¥ã¡ã³ããšããŠæ©èœãããã®ååïŒããªã¹ãããªã©ïŒã¯ã颿°ãäœãããã®ããçè§£ããããããŸãã
ããã°ã©ãã³ã°ã®ãã¹ãŠãšåæ§ã«ãæè¯ã®æšå¥šäºé
ã¯ãæãæç¢ºãªã¢ãããŒããéžæããããšã§ãã
ã³ã³ãããŒã¿ãŒ
ã ã³ã³ãããŒã¿ ãã¯é¢æ°ãšåŒã°ãããã®çµæã¯ãã©ã¡ãŒã¿ã®ã¿ã«äŸåããŸãã ããã¯ãå€ã®äžçã«äŸåããŠããªãããšãæå³ããç¹ã«ãä»ã®é¢æ°ãã°ããŒãã«ãªå€ãå€ã®äžçã«åœ±é¿ãäžããããšã¯ã§ããŸããã
å®éã«ã¯ãããã¯çµã¿åããæ©èœãããŸããŸãªæ¹æ³ã§ãã©ã¡ãŒã¿ãŒã®çµã¿åããã«ãã£ãŠå¶éãããããšãæå³ããŸãã
ãã€ããšæ§ææŒç®åãšããããã€ãã®ã³ã³ãããŒã¿ãŒãèŠãŠããŸããã ãããã®å®çŸ©ãèŠããšãããŸããŸãªæ¹æ³ã§ãã©ã¡ãŒã¿ãŒãäžŠã¹æ¿ããŠããã ãã§ããããšã¯æããã§ãã
let (|>) xf = fx // pipe let (<|) fx = fx // pipe let (>>) fgx = g (fx) // let (<<) gfx = g (fx) //
äžæ¹ããprintfãã®ãããªé¢æ°ã¯ãããªããã£ãã§ãããå€éšäžçïŒI / OïŒã«äŸåããŠãããããã³ã³ãããŒã¿ãŒã§ã¯ãããŸããã
çµã¿åããé³¥
ã³ã³ãããŒã¿ã¯ãã³ã³ãã¥ãŒã¿ããã³ããã°ã©ãã³ã°èšèªãããäœå¹Žãåã«çºæãããããžãã¯ïŒèªç¶ã«ãã³ã³ããããªã¢ã«ããžãã¯ããšåŒã°ããïŒå
šäœã®åºç€ã§ãã çµã¿åããããžãã¯ã¯ã颿°åããã°ã©ãã³ã°ã«éåžžã«å€§ããªåœ±é¿ãåãŒããŸãã
ã³ã³ãããŒã¿ãšçµã¿åããããžãã¯ã®è©³çްã«ã€ããŠã¯ãRaymond Smullyanã®æ¬ãTo Mock a Mockingbirdãããå§ãããŸãã ãã®äžã§ã圌ã¯ä»ã®ã³ã³ãããŒã¿ãŒã説æãã圌ãã«é³¥ã®ååã空æ³çã«äžããŸãã æšæºã³ã³ãããŒã¿ãŒãšãã®é³¥ã®ååã®äŸã次ã«ç€ºããŸãã
let I x = x // , Idiot bird let K xy = x // the Kestrel let M x = x >> x // the Mockingbird let T xy = yx // the Thrush ( !) let Q xyz = y (xz) // the Queer bird ( !) let S xyz = xz (yz) // The Starling // ... let rec Y fx = f (Y f) x // Y-, Sage bird
ãªãã©ã«åã¯éåžžã«æšæºçãªããããã®çšèªã«ç²ŸéããŠãã人ãªã誰ã§ãKã³ã³ãããŒã¿ãŒãåç
§ã§ããŸãã
å€ãã®äžè¬çãªããã°ã©ãã³ã°ãã¿ãŒã³ã¯ããããã®æšæºçãªã³ã³ãããŒã¿ãä»ããŠè¡šçŸã§ããããšãããããŸãã ããšãã°ãKestrelã¯ãäœãããããå
ã®ãªããžã§ã¯ããè¿ããæµãããããªã€ã³ã¿ãŒãã§ã€ã¹ã®äžè¬çãªãã¿ãŒã³ã§ãã ãã°ãã¯ãã€ãã§ãããã¯ã£ã¢ã¯çŽæ¥çãªåæã§ãããYã³ã³ãããŒã¿ãŒã¯ååž°é¢æ°ãäœæããåªããä»äºãããŸãã
å®éãèšç®å¯èœãªé¢æ°ã¯ãKestrelãšStarlingã®2ã€ã®åºæ¬çãªçµã¿åããã®ã¿ã䜿çšããŠæ§ç¯ã§ãããšããå®çããããŸãã
çµã¿åããã©ã€ãã©ãª
çµã¿åããã©ã€ãã©ãªã¯ãå
±æããããã«èšèšãããå€ãã®çµã¿åãã颿°ããšã¯ã¹ããŒãããã©ã€ãã©ãªã§ãã ãã®ãããªã©ã€ãã©ãªã®ãŠãŒã¶ãŒã¯ã颿°ãç°¡åã«çµã¿åãããŠããã¥ãŒããªã©ã®ããã«å€§ããè€éãªé¢æ°ãç°¡åã«ååŸã§ããŸãã
é©åã«èšèšãããã³ã³ãã€ãã©ã€ãã©ãªã«ãããé«ã¬ãã«ã®æ©èœã«éäžããäœã¬ãã«ã®ããã€ãºããé ãããšãã§ããŸãã ãFïŒã䜿çšããçç±ãã·ãªãŒãºã®ããã€ãã®äŸã§æ¢ã«ãã®åãèŠãŠããŸããããŸãã List
ã¢ãžã¥ãŒã«ã«ã¯ãã®ãããªæ©èœããããããããã fold
ããšã map
ããèããã°ã³ã³ãããŒã¿ãŒã§ãã
ã³ã³ãããŒã¿ã®ãã1ã€ã®å©ç¹ã¯ãæãå®å
šãªã¿ã€ãã®é¢æ°ã§ããããšã§ãã ãªããªã ãããã¯å€ã®äžçã«äŸåãããã°ããŒãã«ç°å¢ãå€åããŠãå€åããããšã¯ã§ããŸããã ã°ããŒãã«å€ãèªã¿åã颿°ãŸãã¯ã©ã€ãã©ãªé¢æ°ã䜿çšãã颿°ã¯ãã³ã³ããã¹ãã倿ŽããããšãåŒã³åºãéã§äžæãŸãã¯å€æŽãããå ŽåããããŸãã ããã¯ã³ã³ãããŒã¿ãŒã«ã¯æ±ºããŠèµ·ãããŸããã
FïŒã§ã¯ãã³ã³ãããŒã¿ã©ã€ãã©ãªãè§£æïŒFParsecïŒãHTMLã®äœæããã¬ãŒã ã¯ãŒã¯ã®ãã¹ããªã©ã«äœ¿çšã§ããŸãã ã³ã³ãããŒã¿ã«ã€ããŠã¯ã次ã®ã·ãªãŒãºã®åŸåã§èª¬æãã䜿çšããŸãã
ååž°é¢æ°
å€ãã®å Žåã颿°ã¯ãã®æ¬äœããèªèº«ãåç
§ããå¿
èŠããããŸãã å
žåçãªäŸã¯ããã£ãããã颿°ã§ãã
let fib i = match i with | 1 -> 1 | 2 -> 1 | n -> fib(n-1) + fib(n-2)
æ®å¿µãªããããã®é¢æ°ã¯ã³ã³ãã€ã«ã§ããŸããã
error FS0039: The value or constructor 'fib' is not defined
rec
ããŒã¯ãŒãã䜿çšããŠããããååž°é¢æ°ã§ããããšãã³ã³ãã€ã©ãŒã«äŒããå¿
èŠããããŸãã
let rec fib i = match i with | 1 -> 1 | 2 -> 1 | n -> fib(n-1) + fib(n-2)
颿°åããã°ã©ãã³ã°ã§ã¯ååž°çãªé¢æ°ãšããŒã¿æ§é ãéåžžã«äžè¬çã§ããããã®ãããã¯ã«ã€ããŠã¯åŸã§ã·ãªãŒãºå
šäœãåãäžããããšæããŸãã
远å ã®ãªãœãŒã¹
FïŒã«ã¯ãCïŒãŸãã¯Javaã®çµéšããã人åãã®è³æãªã©ãå€ãã®ãã¥ãŒããªã¢ã«ããããŸãã æ¬¡ã®ãªã³ã¯ã¯ãFïŒã®è©³çްã説æããã®ã«åœ¹ç«ã¡ãŸãã
FïŒã®åŠç¿ãéå§ããä»ã®ããã€ãã®æ¹æ³ã«ã€ããŠã説æããŸãã
æåŸã«ãFïŒã³ãã¥ããã£ã¯éåžžã«åå¿è
ã«åªããã§ãã Slackã«ã¯ãFïŒSoftware FoundationããµããŒãããéåžžã«æŽ»çºãªãã£ãããããã èªç±ã«åå ã§ããåå¿è
ã«ãŒã ããããŸãã ãããè¡ãããšã匷ããå§ãããŸãïŒ
ãã·ã¢èªã話ãã³ãã¥ããã£FïŒã®ãµã€ãã蚪ããããšãå¿ããªãã§ãã ããïŒ èšèªã®åŠç¿ã«ã€ããŠè³ªåãããå Žåã¯ããã£ããã«ãŒã ã§ãæ°è»œã«ãçžè«ãã ããã
翻蚳èè
ã«ã€ããŠ
@kleidemosã«ãã翻蚳
翻蚳ãšç·šéäžã®å€æŽã¯ãFïŒéçºè
ã®ãã·ã¢èªã³ãã¥ããã£ã®åªåã«ãã£ãŠè¡ãããŸããã ãŸãããã®èšäºãå
¬éããæºåãããŠããã@schvepsssãš@shwarsã«ãæè¬ããŸãã