- 関数型プログラミング言語Haskell Part32
241 :デフォルトの名無しさん[]:2019/03/22(金) 06:11:43.80 ID:t/nkQ3ne - 一応、カウンターみたいなのは純粋関数型言語には作れない言われてたから、作ってみた。
確かにi++みたいな事は出来ないが、違う方法で参照透明性を確保しつつ実現出来ると実感。 (個人的にHaskellには副作用はあると考えているが、参照透明性は崩れないとも考えている)
|
- なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net
863 :デフォルトの名無しさん[]:2019/03/22(金) 06:20:32.16 ID:t/nkQ3ne - リストに対してはクイックソートやマージソートより選択ソートや挿入ソートのが速かった。
ケースによって使い分けるために色んなソートがあるんだなと実感した。
|
- 関数型プログラミング言語Haskell Part32
243 :デフォルトの名無しさん[]:2019/03/22(金) 07:32:41.43 ID:t/nkQ3ne - うい。
そう言う仕組みになってるくせに、IOな関数も扱いとしては純粋な関数と同じ扱いなのが気に入ってます。 (型に気をつけていれば自然とそうなるし、普通にprint関数と純粋関数を関数合成出来るのが好き)
|
- 関数型プログラミング言語Haskell Part32
245 :デフォルトの名無しさん[]:2019/03/22(金) 08:09:16.10 ID:t/nkQ3ne - >>244
そうなんですが、純粋関数型言語の場合、その関数を何回呼び出したのかカウントする関数を作るみたいな視点の切り替えで対処するのではと。 つまり自身のファイルを読み込んで自身(counter関数)を a = counter b = counter a = 1 b = 2 に置き換える関数なら作れます。 欲しいのは結果であり、動作ではなく結果が同じなら良いと言う解釈です。
|
- 関数型プログラミング言語Haskell Part32
246 :デフォルトの名無しさん[]:2019/03/22(金) 10:06:06.24 ID:t/nkQ3ne - 終了やカウントクリアに対応してみた。
import System.Exit main = do putStrLn "quit code is 'q', count clear code 'c'" mapM_ (\n -> print n >> getLine >>= f) [0..] f "quit" = exitWith ExitSuccess f "clear" = main f _ = return ()
|
- 関数型プログラミング言語Haskell Part32
248 :デフォルトの名無しさん[]:2019/03/22(金) 14:11:11.50 ID:t/nkQ3ne - まあ要はcounter関数はswap関数と同じですよ。
手続き型言語ではソートや繰り返しに必須ですが、関数型言語で各種ソート作る時にswap関数は使った事がない。 木を見て森を見ずというか、counter関数を何に使うの?って話で、カウンターとしての用途なら再帰関数の引数でf (x + 1)とか渡せば良いだけですし。 loop10 n | n > 10 = return () loop10 n = print n >> getLine >> loop10 (n + 1)
|
- 関数型プログラミング言語Haskell Part32
251 :デフォルトの名無しさん[]:2019/03/22(金) 15:36:25.55 ID:t/nkQ3ne - そこは気を付けなきゃだけど(と言うか、スタックは兎も角ヒープ使うってreverseみたいにリスト溜め込むとかだけで、手続き型言語でもあり得る場面に限られそうだが)、
むしろモナドな再帰(IOはもちろん、リスト->リストな再帰も)がループになると言うのは、 手続き型言語よりも再帰でスタック使うケースが少ないと言う魅力もある。 (ここは手続き型言語が末尾再帰最適化に対応しても追いつけない所) >>246 の通り、mainを再帰的に呼び出してもループになると言うのは知る限り手続き型言語では見たことない。 main変数が他の言語で言うmain関数的な動きをしているのも、圏論的には変数は引数無しの関数と見做せるから。 main変数を評価しようとすると束縛されたプログラムが動き出す。 n = 1 ― 変数であり、常に1を返す引数無しの関数
|
- くだすれPython(超初心者用) その42【Ruby禁止】
179 :デフォルトの名無しさん[]:2019/03/22(金) 15:54:48.11 ID:t/nkQ3ne - Pythonにも言えるだろうけど、JavaScriptはwebのアセンブラみたいな地位だから変えられないけど、
型がないからデバッグが大変という事でTypeScriptとかelmとか出てるご時世に生のJavaScript動かせるって言うのも逆に危険じゃね? TypeScript動かせますとか、生JavaScriptの型検査出来ますとかでも無ければ、むしろ嫌われ機能じゃ。。。
|
- 関数型プログラミング言語Haskell Part32
255 :デフォルトの名無しさん[]:2019/03/22(金) 22:26:05.94 ID:t/nkQ3ne - ヒープにあろうがスタックにあろうが末尾再帰に意識して書けばまず解決する問題だね。
ghciやrunghcみたいなスクリプト形式だと最適化(部分的な正格評価)が不十分で sum’ n [] = n sum’ n (x:xs) = sum’ (n + x) xs という末尾再帰があった場合、 sum’ 0 [1,2,3] = sum’ (0 + 1) [2,3] = sum’ ((0 + 1)+ 2) [3] = sum’ (((0 + 1)+ 2)+ 3) [] みたいに(遅延評価のせいで)結果を入れる変数の方でスタック消費するけども、コンパイラ(ghc)の方はこの問題は無い。
|
- 関数型プログラミング言語Haskell Part32
256 :デフォルトの名無しさん[]:2019/03/22(金) 22:43:20.21 ID:t/nkQ3ne - >>254
別に数列(リスト)から取り出す形にすれば末尾再帰にする必要ないでしょ。 main = print $ fibs!!3 ― 0から数えて3番目 where fibs = 0:1:zipWith (+) fibs (tail fibs) foldlの正格評価版 foldl’みたいにzipWithの正格評価版作って差し替えると高速化する。 (このネタ書いてたブログの人はzipWith’を標準で入れてて欲しいって書いてた) zipWith’ f (x:xs) (y:ys) = seq a $ a:zipWith f xs ys where a = f x y zipWith’ _ _ _ = []
|