2021-06-05 Sat. â ãªã¹ãã®æä½ãã¯ã¤ãã¯ã½ã¼ã
åå¼·
ããã°ã©ãã³ã° in OCaml (â§5.4 Case Study: æ´åã¢ã«ã´ãªãºã )
ç³ã¿è¾¼ã¿é¢æ°fold
ä½ãã£ã¦ãã®ãããããªãã®ã§ãã¬ã¼ã¹ããã
let rec fold_right f l e = match l with [] -> e | x :: rest -> f x (fold_right f rest e);;
fold_right ( + ) [3; 4; 5] 0 (*ã[3; 4; 5] match with 3 :: [4; 5] *) --> ( + ) 3 (fold_right ( + ) [4; 5] 0) (* [4; 5] match with 4 :: [5] *) --> ( + ) 3 ( ( + ) 4 (fold_right) ( + ) [5] 0) (* [5] match with 5 :: [] *) --> ( + ) 3 ( ( + ) 4 ( ( + ) 5 (fold_right ( + ) [] 0))) (* [] match with [] *) --> ( + ) 3 ( ( + ) 4 ( ( + ) 5 ( 0 ) ) ) --> ( + ) 3 ( ( + ) 4 5) (* ä¸çªå³ãã ( + ) ããã¦ãã *) --> ( + ) 3 9 --> 12
ãã1åããããªããã¤
let rec nth n l = match with (n, l) (1, a :: _) -> a | (_, _ :: rest) -> nth (n - 1) rest;;
nth 3 [3; 1; 4; 1] (* match with (_, _ :: [1; 4; 1]) *) --> nth 2 [1; 4; 1] (* match with (_, _ :: [4; 1]) *) --> nth 1 [4; 1] (* match with (1, 4 :: [1]) *) --> 4
æ¸ãããåä½ã¯ããããã©ãèªåã§ãã®å台颿°ãå®ç¾©ããã®é£ãããã
§5.4 Case Study: æ´åã¢ã«ã´ãªãºã
ããã§çæãã¦ããæ¬ä¼¼ä¹±æ°å(ä¸è¦ã©ã³ãã ã«ä¸¦ãã§ããããã«è¦ããæ°å)ã¯ãä¹ç®ååæ³(Lehmerä¹±æ°çæ)ã¨ããããæ¹ã
https://en.wikipedia.org/wiki/Lehmer_random_number_generator
ã«è¼ã£ã¦ããã
漸åå¼ã§å®ç¾©ãããæ°åã§ã
ã¨å®ç¾©ããããããã並ã¹ãã¨ã©ã³ãã ã«è¦ããæ°åãã§ãããæ°åä¸ã«åãæ°ãåºã¦ããã¨ä»¥ä¸ã«ã¼ãããããã¾ããã¨åæå¤(ã·ã¼ãã¨ãå¼ã¶)㨠ã¨
ãæ±ºããã°é·ããã¨ã«ã¼ãããªãæé ãªæ¬ä¼¼ä¹±æ°åãã§ããã
(
) ã
(
) ã¨ããã¨ãã¾ããã¨ãããããã
let nextrand seed = let a = 16807. and m = 2147483647. in let t = a *. seed in t -. m *. floor (t /. m);;
ã§æ¼¸åå¼ãå®ç¾©ãã¦ã
let rec randlist n seed tail = if n = 0 then (seed, tail) else randlist (n - 1) (nextrand seed) (seed::tail);;
ã§ã é
ç®ã¾ã§ã®æ¬ä¼¼ä¹±æ°åã®ãªã¹ããè¿ãã
ã¯ã¤ãã¯ã½ã¼ã
ãªã¹ããé©å½ãªè¦ç´ (pivot
ã¨ãã)ãåºæºã«2ã¤ã«åãã颿°partition
ãèããã
ç´ æ´ã«partition
ããã¨ã:
let rec partition pivot = function [] -> ([], []) | y :: rest -> let (left, right) = partition pivot rest in if pivot < y then (left, y::right) else (y::left, right);;
ããã ã¨æ«å°¾å帰çã§ã¯ãªãã
ãããæ«å°¾å帰çã«ããããã«ãåå²ã®éä¸ã¾ã§ã®çµæãã¹ãã¢ãã¦ãã夿°ãæç¤ºçã«ä¸ãããã
let rec partition left right pivot = function (* æ«å°¾å帰ç *) [] -> (left, right) | y :: rest -> if pivot < y then partition left (y::right) pivot rest else partition (y::left) right pivot rest;;
then``else
以ä¸ãæå¾ã«å帰ãå¼ã³åºããããã«ãªã£ãã
let rec quick_sort = function [] -> [] | pivot :: rest -> let (left, right) = partition [] [] pivot rest in quick_sort left @ (pivot :: quick_sort right);;
ããã§ãpartition
ããquick_sort
ã®pivot
ã®æå¹ç¯å²å
ã§å±æé¢æ°ã¨ãã¦çµã¿è¾¼ããããã
let rec quick_sort = function [] -> [] | pivot :: rest -> (* ããã§ partition ãå®ç¾©ãã *) let rec partition left right = function (* pivot ã¯ããæ¸¡ããã¦ããã®ã§å®ç¾©ã«ã¯ä¸è¦ *) [] -> (left, right) | y :: ys -> (* rest ã¯æ¢ä½¿ç¨ãªã®ã§ ys ã«ãã *) if pivot < y then partition left (y::right) ys (* ããã«ã pivot ä¸è¦ *) else partition (y::left) right ys (* partition ã®å±æå®ç¾©çµäº *) in let (left, right) = partition [] [] rest in quick_sort left @ (pivot :: quick_sort right);;
ããã§ãããã®ã ããæå¾ã«ã¾ã 工夫ããã
let rec quick_sort = function ( [] | [_] ) as l -> l (* 1è¦ç´ ã®ã¨ããèªæãªå¤å½¢ãªã®ã§ç¹å¥æ±ããããå¾è¿° *) | pivot :: rest -> let rec partition left right = function [] -> (quick_sort left) @ (pivot :: quick_sort right) (* å¼ã³åºããããããã£ã¤ããã®ã§ããã®å¦çã partition ã®ä¸ã«çµã¿è¾¼ã *) | y :: ys -> if pivot < y then partition left (y::right) ys else partition (y::left) right ys in partition [] [] rest;;
- ãã®é¢æ°ã®åé ã§( [] | [_] ) ã¨æ¸ãã¦ããããããã¯è¤æ°ã®ãã¿ã¼ã³ã
|
ã§åºåã£ã¦ä¸¦ã¹ã or ãã¿ã¼ã³ã|
ã§ç¹ããã¦ããåãã¿ã¼ã³ã§å®£è¨ããã¦ãã夿°ã¯åãã§ãªãã¦ã¯ãªããªã(( [] | [x] )
ã¨ãã¯ãã¡)ã
ãã¿ã¼ã³ as 夿°
㯠as ãã¿ã¼ã³ãå å´ã®ãã¿ã¼ã³ããããããã¨ãã®ã¿as
ãã¿ã¼ã³å ¨ä½ãããããããããã¦å¤æ°
ãå å´ã®ãã¿ã¼ã³ã«ãããããå¤ã«æç¸ããã- ãã®é¢æ°ã§ã¯ã
l
ãé·ã 1 以ä¸ã®ãªã¹ãå ¨ä½ã«æç¸ãããã
- ãã®é¢æ°ã§ã¯ã
Tips
- ã·ã§ã«ã§ã¯
clear
ã³ãã³ãã§ç»é¢ã䏿ãã¦ä¸çªä¸ããæ¸ãå§ããããã OCamlã§ã¯Sys.command "clear";;
ã - ãã³ã³ããã¹ããã®æå³ https://stackoverflow.com/questions/6145091/the-term-context-in-programming
æ¥è¨
æé 25æ¥ç®ã
仿¥ã¯ç¥ã£åã®ä¸è©±ããã¦ãããæ¼å¯ãããã
颿°åããã°ã©ãã³ã°ãå¦ã³å§ãã¦ãè¦ãã¦ããå°å¹³ãå°ããã¤åºãã£ã¦ããã
ææ¥ãããããã¨
- ããã°ã©ãã³ã° in OCaml 5ç« ã®ç·´ç¿åé¡
- RDFåãåããè¨èª SPARQL ãå°ã調æ»ãhttps://www.w3.org/TR/rdf-sparql-query/
- WordPressã¬ãã¹ã³ããã¯