24/11/01 11:18:17.62 MT2bV/S9.net
関数型言語MLについて語るスレッドです。
MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML URLリンク(www.smlnj.org)
Objective Caml URLリンク(ocaml.org)
前スレ
関数型言語ML (SML, OCaml, etc.), Part 7
スレリンク(tech板)
2:デフォルトの名無しさん
24/11/01 18:37:35.02 nrkm3PTC.net
関数型言語ML (SML, OCaml, etc.), Part 6
スレリンク(tech板)
関数型言語ML(SML, OCaml, etc.), Part 5
スレリンク(tech板)
関数型言語ML(SML, OCaml, etc.), Part 4
スレリンク(tech板)
関数型言語ML(SML, OCaml, etc.), Part 3
スレリンク(tech板)
let t = 関数型プログラミング言語ML 2
スレリンク(tech板)
関数型プログラミング言語ML
スレリンク(tech板)
3:デフォルトの名無しさん
24/11/02 16:39:45.15 Z24kzP6m.net
ML (programming language) 1973年に登場
URLリンク(en.wikipedia.org)(programming_language)
J. Roger Hindley 1939年生まれ
URLリンク(en.wikipedia.org)
Robin Milner 1934年生まれ 2010年没
URLリンク(en.wikipedia.org)
4:デフォルトの名無しさん
24/11/02 16:54:43.41 Z24kzP6m.net
◎SMLで関数の定義いろいろ
fun factorial n =
if n = 0 then 1 else n * factorial (n - 1)
◎clausal function definitions
fun factorial 0 = 1
| factorial n = n * factorial (n - 1)
◎whileもある
fun factorial n = let val i = ref n and acc = ref 1 in
while !i > 0 do (acc := !acc * !i; i := !i - 1); !acc
end
◎ラムダ関数として
val rec factorial = fn 0 => 1 | n => n * factorial (n - 1)
Standard ML
URLリンク(en.wikipedia.org)
5:デフォルトの名無しさん
24/11/02 20:34:17.15 0jOsGELW.net
◎OCamlで関数の定義いろいろ
let rec factorial n =
if n = 0 then 1 else n * factorial (n - 1)
◎whileもある
let factorial n = let i = ref n and acc = ref 1 in
while !i > 0 do acc := !acc * !i; i := !i - 1; done; !acc
◎forもある
let factorial n = let acc = ref 1 in
for i = 1 to n do acc := !acc * i done; !acc
◎ラムダ関数として
let rec factorial = function 0 -> 1 | n -> n * factorial (n - 1)
◎末尾再帰
let factorial =
let rec aux acc n = if n < 1 then acc else aux (acc * n) (n - 1) in aux 1
6:デフォルトの名無しさん
24/11/10 04:54:10.83 qqtxoROGN
例えば、登録記号「JA323N」は「盗撮窃盗詐欺猥褻集団ダサイタマ県警」た゛が
クソ航空機に生活や仕事を妨害されたらアプリ『ÅDS-B Unfiltered...」で登録記号確認
URLリンク(jasearch.info) ←ここで犯人特定
ADS-B出してない日の丸ロコ゛機体は憲法違反税金泥棒自閉隊関係だが、益々調子こいてるこいつらテロリストと゛もをどんなやり方でも
いいから早急に皆殺しにしないとこいつらが撒き散らしてる莫大な温室効果ガスで益々災害連発して次に殺されるのはお前だぞ
ヘリタンク2000Lて゛10000kWh火力発電したのと同等のcO2を排出するがガソリン税と比較してもゼ□に等しい税率だし
輸入している石油を大量に無駄に燃やしてんだから石油価格高止まりして電気料金などの高騰原因になってるし
騒音で知的産業壞滅して超絶デジ夕ル後進国、情報漏洩に不正送金にシステ厶障害まみれ,IT界て゛は日本語の技術情報消滅
こんな史上最悪の強盗殺人がスルーされてんだから俺も俺もと闇バイ├に強盜殺人にと流行るのは当然かつ正当な権利だわな
〔ref.〕 ttps://www.call4.jp/info.php?тype=items&id=I0000062
Ttps://hanеda-projecт.jimdofree.Com/ , URLリンク(fligh)<)
7:デフォルトの名無しさん
24/11/17 22:38:39.01 vlQbYPk+.net
◎Haskellで関数の定義いろいろ
factorial n =
if n = 0 then 1 else n * factorial (n - 1)
◎ガード
factorial n
| n == 0 = 1
| otherwise = n * factorial (n - 1)
◎foldl
factorial n = foldl (*) 1 [1..n]
◎product = foldl (*) 1
factorial n = product [1..n]
◎ラムダ関数として
factorial = \n -> if n = 0 then 1 else n * factorial (n - 1)
◎末尾再帰(空白が全部1個になるので_に置き換えてます)
factorial = f 1
___where
______f a 0 = a
______f a x = f (a * x) (x - 1)
8:デフォルトの名無しさん
24/11/17 23:01:25.43 vlQbYPk+.net
肝心のパターンマッチ忘れてた
factorial 0 = 1
factorial n = n * factorial (n - 1)
9:デフォルトの名無しさん
24/11/24 21:33:47.09 7LCq6ZGA.net
Haskellにも一応forM/forM_ というのはあるけど、mapM/mapM_ の引数を逆にしただけ。
そして、OCaml の for版 factorial は副作用前提なので、Haskellで書くとしたらIORef使ってメモリと入出力処理をする。
(Haskellでは、メモリもファイルやIOと同じ扱い)
◎for(M)もある
import Data.IORef
import Control.Monad -- forM_ のため。mapM_ の引数を入れ替えただけなので本当は要らない子
factorial n = do x <- newIORef 1
forM_ [1..n] (modifyIORef x.(*)) -- xに x *= 1, x *= 2 と、リストの末尾まで更新を繰り返す
readIORef x -- x から値を取り出す
10:デフォルトの名無しさん
24/11/24 21:36:31.64 7LCq6ZGA.net
全角の空白だと消えない。
コピペするときは注意だけど。
11:デフォルトの名無しさん
25/02/08 15:58:06.70 +2jmv8fY.net
どうせ今はJavaだろうがPHPだろうが関数型の機能あるんでしょ?結局はJavaでいいじゃん
12:デフォルトの名無しさん
25/02/09 04:00:52.37 8d730QrP.net
パターンマッチ渡しがないから
Maybe monadとか使うのが非常に面倒
13:デフォルトの名無しさん
25/02/09 15:52:20.68 nVH+xYHa.net
末尾再帰最適化の保証がないと関数型スタイルにはできん
14:デフォルトの名無しさん
25/02/10 22:59:06.21 o2Gr18iQ.net
Maybeはネーミングが悪いよな
今ではほとんどの言語でOptionだろ
15:デフォルトの名無しさん
25/02/11 02:42:42.11 iiJDGlnL.net
Schemeが手続き型作法で書けて
>>12も>>13もクリアしてるけど人気なくなったよな
16:デフォルトの名無しさん
25/03/11 19:24:49.09 O+8SFaAq.net
括弧あるからね
17:デフォルトの名無しさん
25/03/11 19:25:18.02 O+8SFaAq.net
HaskellやOCamlだってそこまで人気じゃないし
18:デフォルトの名無しさん
25/08/04 23:10:42.74 V0OTCQ/u.net
>>11
うーむ、そもそもHaskellを離れられないのはiHaskell触ってからf-elseやswitch-case文を書くのがマンドクセ((+_+))
ってなったのと、Haskellは(+)などのセクションと部分適用で巧みにラムダ式を使わないで済むのが楽なんだよね。
あと、関数に括弧が要らないのも部分適用と合わせて楽すぎる。
19:デフォルトの名無しさん
25/10/12 04:47:03.78 W2SaGlg4.net
>>13,15
言語か実装かどっちの話よ…
schemeは仕様にTCO入ってるけど、あれは言語仕様に実装を持ち込むという暴挙
よく巷(笑)ではschemeの仕様はキレイなんだ!!などとほざくアホが絶えないが、むしろこれはこの上なく醜い…evilでさえあると思える
仕様と実装の分離原則の冒涜を冒しているからだ
じゃあ同一設計者(G.L.Steele)による兄弟言語のcommon lispの仕様はどうかというと、当然実装は問われていない、しかし私の使うメジャー実装5種類ちゃんとすべてTCOだ
(俺LISPにすら簡単に実装できたので、あえてTCOにしない実装などありえないのでは)
もちろんcやその遠い系列の言語も大体そう、例えばcなら仮想機械の振る舞いで言語を定義、当然実装とは分離されてる
20:デフォルトの名無しさん
25/10/12 18:26:01.89 S8M8nKTN.net
C++でもなんでも結構「これこれこういう最適化をしろ」ってのは規格に書いてあるぞ
特定の最適化がされないと使い物にならない言語機能ってのはあるからな
21:デフォルトの名無しさん
25/10/18 14:31:06.07 IJLk7kKz.net
だからこそC++は数少ないevilな言語なんですわ、はい