小6におすすめな言語 (540レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
99(1): デフォルトの名無しさん [] 2020/10/25(日) 09:55:39.29 ID:7UCeAjtw(1/5) AAS
Haskellだと普通の言語より関数化やマルチスレッドプログラミング教え易い。
リストや配列から値を求める->foldl関数
リストや配列から新しいリストや配列を作る->map関数
そのfoldlやmapも自作出来る。
普通の言語では「良く使う機能は関数にまとめましょう」と言いながら良く使うforのパターンを関数にしない。
関数型言語の機能を取り込んで、ライブラリにmapやfold、あるいはcollect、reduceが備わってから使い出した。
文化的に「良く使う機能は関数にまとめましょう」を実践させるのに関数型言語の方が向いてる。
100: デフォルトの名無しさん [] 2020/10/25(日) 09:55:47.63 ID:7UCeAjtw(2/5) AAS
マルチスレッドプログラミングも、身近な所だと四則演算が混じった計算でも、同時に出来るところは同時に計算しても良い。
例として、()で括った箇所は同時に計算して良い。
2 * 3 + 4 / 2 = (2 * 3) + (4 / 2) = 6 + 2 = 8
普通の言語だと、プログラマーがスレッドを作って並列処理させるし、デッドロックを気にしないといけないけど、
関数型言語はここをマルチスレッドでと指定すれば後は言語側がやってくれる。
(普通の言語だと、上の例ですらデッドロックや処理待ちを気にしないといけない)
上の例をマルチスレッドにするとむしろ遅くなるが、クイックソートの分割統治法とかで威力を発揮する。
import Control.Parallel.Strategies
main = print (a + b)
where (a,b) = (2 * 3, 4 `div` 2) `using` evalTuple2 rpar rpar
103: デフォルトの名無しさん [] 2020/10/25(日) 19:11:06.08 ID:7UCeAjtw(3/5) AAS
>>101
うむ。
マルチスレッドまでは言い過ぎた。
でも、forで良く使うパターンを関数化しない or 出来ないのは普通の言語だと演算子が関数の一種として扱われてないから。
わざわざラムダ式や関数書かなきゃ行けないのはスマートじゃない。
高階関数取り入れても、まだまだ再利用性には関数型言語と差がある。
sum = foldl (+) 0
product = foldl (*) 1
reverse = foldl (\xs x -> x:xs) []
104(1): デフォルトの名無しさん [] 2020/10/25(日) 19:11:15.93 ID:7UCeAjtw(4/5) AAS
>>102
ぶっちゃけその通り。
ただ、今の教育課程はいささか・・・いあ、大分不安がある。
例えば足し算の性質、合併と増加。
参考書では同時か後からかの違いと説明されるが、これではリンゴとみかんの合計の様な違うものの足し算の説明が出来ない。
ペアノの公理はリストと同型であるが、そう考えると合併はappend(リストの結合)だ。
一方の増加は足す数をカウンタとして足される数を増やすので、見ようによっては足す数の型を足される数の型に変換して合併する処理だ。
型にすると
合併の型: a -> a -> a
増加の型: a -> b -> a
そうするとリンゴとみかんの合計は
リンゴとみかん リンゴ みかん
(0 + 3) + 5
リンゴとみかん みかん
3 + 5
リンゴとみかん
8
となる。
106: デフォルトの名無しさん [] 2020/10/25(日) 19:31:04.14 ID:7UCeAjtw(5/5) AAS
合併のHaskell(リスト)の例
[] ++ ys = ys
(x:xs) ++ ys = xs ++ (x:ys)
[1,1,1] ++ [1,1]
= [1,1] ++ 1:[1,1]
= [1] ++ 1:1:[1,1]
= [] ++ 1:1:1:[1,1]
= 1:1:1:[1,1]
= [1,1,1,1,1]
増加のHaskell(リスト)の例
xs ^+ [] = xs
xs ^+ (_:ys) = 1:xs ^+ ys
[1,1,1] ^+ ['a','b']
= 1:[1,1,1] ^+ ['b']
= 1:1:[1,1,1] ^+ []
= 1:1:[1,1,1]
= [1,1,1,1,1]
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.016s