関数型言語MLについて語るスレッドです。
MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML https://www.smlnj.org/
Objective Caml https://ocaml.org/
前スレ
関数型言語ML (SML, OCaml, etc.), Part 7
https://mevius.5ch.net/test/read.cgi/tech/1509524735/
探検
関数型言語ML (SML, OCaml, etc.), Part 8
2024/11/01(金) 11:18:17.62ID:MT2bV/S9
2024/11/01(金) 18:37:35.02ID:nrkm3PTC
関数型言語ML (SML, OCaml, etc.), Part 6
http://mevius.2ch.net/test/read.cgi/tech/1245017721/
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/
関数型言語ML(SML, OCaml, etc.), Part 4
http://pc11.2ch.net/test/read.cgi/tech/1133003340/
関数型言語ML(SML, OCaml, etc.), Part 3
http://pc8.2ch.net/test/read.cgi/tech/1103606223/
let t = 関数型プログラミング言語ML 2
http://pc5.2ch.net/test/read.cgi/tech/1058630709/
関数型プログラミング言語ML
http://pc2.2ch.net/test/read.cgi/tech/1012445015/
http://mevius.2ch.net/test/read.cgi/tech/1245017721/
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/
関数型言語ML(SML, OCaml, etc.), Part 4
http://pc11.2ch.net/test/read.cgi/tech/1133003340/
関数型言語ML(SML, OCaml, etc.), Part 3
http://pc8.2ch.net/test/read.cgi/tech/1103606223/
let t = 関数型プログラミング言語ML 2
http://pc5.2ch.net/test/read.cgi/tech/1058630709/
関数型プログラミング言語ML
http://pc2.2ch.net/test/read.cgi/tech/1012445015/
2024/11/02(土) 16:39:45.15ID:Z24kzP6m
ML (programming language) 1973年に登場
https://en.wikipedia.org/wiki/ML_(programming_language)
J. Roger Hindley 1939年生まれ
https://en.wikipedia.org/wiki/J._Roger_Hindley
Robin Milner 1934年生まれ 2010年没
https://en.wikipedia.org/wiki/Robin_Milner
https://en.wikipedia.org/wiki/ML_(programming_language)
J. Roger Hindley 1939年生まれ
https://en.wikipedia.org/wiki/J._Roger_Hindley
Robin Milner 1934年生まれ 2010年没
https://en.wikipedia.org/wiki/Robin_Milner
2024/11/02(土) 16:54:43.41ID:Z24kzP6m
◎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
https://en.wikipedia.org/wiki/Standard_ML
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
https://en.wikipedia.org/wiki/Standard_ML
2024/11/02(土) 20:34:17.15ID:0jOsGELW
◎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
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デフォルトの名無しさん
2024/11/17(日) 22:38:39.01ID:vlQbYPk+ ◎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)
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)
7デフォルトの名無しさん
2024/11/17(日) 23:01:25.43ID:vlQbYPk+ 肝心のパターンマッチ忘れてた
factorial 0 = 1
factorial n = n * factorial (n - 1)
factorial 0 = 1
factorial n = n * factorial (n - 1)
8デフォルトの名無しさん
2024/11/24(日) 21:33:47.09ID:7LCq6ZGA 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 から値を取り出す
そして、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 から値を取り出す
9デフォルトの名無しさん
2024/11/24(日) 21:36:31.64ID:7LCq6ZGA 全角の空白だと消えない。
コピペするときは注意だけど。
コピペするときは注意だけど。
2025/02/08(土) 15:58:06.70ID:+2jmv8fY
どうせ今はJavaだろうがPHPだろうが関数型の機能あるんでしょ?結局はJavaでいいじゃん
2025/02/09(日) 04:00:52.37ID:8d730QrP
パターンマッチ渡しがないから
Maybe monadとか使うのが非常に面倒
Maybe monadとか使うのが非常に面倒
2025/02/09(日) 15:52:20.68ID:nVH+xYHa
末尾再帰最適化の保証がないと関数型スタイルにはできん
2025/02/10(月) 22:59:06.21ID:o2Gr18iQ
Maybeはネーミングが悪いよな
今ではほとんどの言語でOptionだろ
今ではほとんどの言語でOptionだろ
2025/02/11(火) 02:42:42.11ID:iiJDGlnL
15デフォルトの名無しさん
2025/03/11(火) 19:24:49.09ID:O+8SFaAq 括弧あるからね
16デフォルトの名無しさん
2025/03/11(火) 19:25:18.02ID:O+8SFaAq HaskellやOCamlだってそこまで人気じゃないし
17デフォルトの名無しさん
2025/08/04(月) 23:10:42.74ID:V0OTCQ/u >>10
うーむ、そもそもHaskellを離れられないのはiHaskell触ってからf-elseやswitch-case文を書くのがマンドクセ((+_+))
ってなったのと、Haskellは(+)などのセクションと部分適用で巧みにラムダ式を使わないで済むのが楽なんだよね。
あと、関数に括弧が要らないのも部分適用と合わせて楽すぎる。
うーむ、そもそもHaskellを離れられないのはiHaskell触ってからf-elseやswitch-case文を書くのがマンドクセ((+_+))
ってなったのと、Haskellは(+)などのセクションと部分適用で巧みにラムダ式を使わないで済むのが楽なんだよね。
あと、関数に括弧が要らないのも部分適用と合わせて楽すぎる。
18デフォルトの名無しさん
2025/10/12(日) 04:47:03.78ID:W2SaGlg4 >>12,14
言語か実装かどっちの話よ…
schemeは仕様にTCO入ってるけど、あれは言語仕様に実装を持ち込むという暴挙
よく巷(笑)ではschemeの仕様はキレイなんだ!!などとほざくアホが絶えないが、むしろこれはこの上なく醜い…evilでさえあると思える
仕様と実装の分離原則の冒涜を冒しているからだ
じゃあ同一設計者(G.L.Steele)による兄弟言語のcommon lispの仕様はどうかというと、当然実装は問われていない、しかし私の使うメジャー実装5種類ちゃんとすべてTCOだ
(俺LISPにすら簡単に実装できたので、あえてTCOにしない実装などありえないのでは)
もちろんcやその遠い系列の言語も大体そう、例えばcなら仮想機械の振る舞いで言語を定義、当然実装とは分離されてる
言語か実装かどっちの話よ…
schemeは仕様にTCO入ってるけど、あれは言語仕様に実装を持ち込むという暴挙
よく巷(笑)ではschemeの仕様はキレイなんだ!!などとほざくアホが絶えないが、むしろこれはこの上なく醜い…evilでさえあると思える
仕様と実装の分離原則の冒涜を冒しているからだ
じゃあ同一設計者(G.L.Steele)による兄弟言語のcommon lispの仕様はどうかというと、当然実装は問われていない、しかし私の使うメジャー実装5種類ちゃんとすべてTCOだ
(俺LISPにすら簡単に実装できたので、あえてTCOにしない実装などありえないのでは)
もちろんcやその遠い系列の言語も大体そう、例えばcなら仮想機械の振る舞いで言語を定義、当然実装とは分離されてる
2025/10/12(日) 18:26:01.89ID:S8M8nKTN
C++でもなんでも結構「これこれこういう最適化をしろ」ってのは規格に書いてあるぞ
特定の最適化がされないと使い物にならない言語機能ってのはあるからな
特定の最適化がされないと使い物にならない言語機能ってのはあるからな
20デフォルトの名無しさん
2025/10/18(土) 14:31:06.07ID:IJLk7kKz だからこそC++は数少ないevilな言語なんですわ、はい
レスを投稿する
ニュース
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 ★2 [蚤の市★]
- JAが"政府の備蓄米買い上げ"見越して価格下げず!?「古いコメは食用向きでないなどと理由をつけ...」専門家解説 [煮卵★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【結婚の壁】結婚どころか今まで恋愛経験は一切ない人も…「年収500万の壁」を突破できない中間層の苦しい現実 [ぐれ★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【高市悲報】レーダー照射で日本が喧嘩売ってる中、アメリカ軍「我々はパールハーバーを忘れない」と日本に向けてポストへ [709039863]
- 本当の問題は高市がバカなことじゃなくて高市みたいなバカを支持するバカが大量にいることだよな [314039747]
- 高市首相「自らの命は自らが守るという原則で、行動とっていただきたい」 [256556981]
- 今時手編みのマフラーとセーターと帽子と手袋のプレゼントってwww
- 【悲報】世界「トランプよりヤバいリーダーがいた!」トランプ「俺よりやべえ奴がいる!」高市早苗「??何で皆アタシを避けるの?」 [517791167]
- 俺「それが史実だというソースは?」 ネトウヨ「書いてないということがソース」 [314039747]
