関数型言語ML (SML, OCaml, etc.), Part 7
関数型言語MLについて語るスレッドです。
MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/
前スレ
関数型言語ML (SML, OCaml, etc.), Part 6
http://mevius.2ch.net/test/read.cgi/tech/1245017721/ すべてを関数と見なすだけ
定数も「定数を表す関数」と見なす
immutableかどうかは別の話 初心者質問いいですか
ocamlコマンドでスクリプトみたいにコード走らされるけど、coreを使った途端できなくなりました。
追加でコマンドオプションが必要なのでしょうか? 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
KDJWC fableってのが面白そうだ・・・F#からJavascriptに変換してHTML5アプリとか作れるらしい
時間ができたらいじってみようかな おい!あの岡部健(毛の壁)がgithubで活動を再会してるぞ! OCamlで質問なんですが、1つのリストに対してmapしてfilterして、またmapしてみたいなことをするとき、
新しいリストがその度に、上の例で言うと3回作られるという認識であってますか? 合ってる
それにクロージャを渡すだけでも結構コストがあるので
自分でループ書いたほうが効率がいい やっぱりそうですか
ありがとうございます
Haskellと違い正格評価なのだから当たり前ですよね
素直にループで書きます >>21
ありがとうございます
調べてみます
関数型はHaskellから入ってml系は知らないので、ちょっとずつ慣れていきます Stream用のmap、filter、foldは標準では無いから、とりあえずはここのStream combinatorsからコピペして使ってね
https://ocaml.org/learn/tutorials/streams.html OCamlの関数定義で型を記述するのって、あまり良くないスタイルですか?
同じく型推論してくれるHaskellだと、型を書くのが推奨されてるみたいですが ocamlはスタイルの良し悪しを言えるような綺麗な構文してないし
人のコード見てもまちまちなんで、好きに書けばいいよ ocamlってどうやって勉強していけばいいんだろ
参考になりそうなコードとか全然見つからないし
「プログラミング in OCaml」か「Real World Ocaml」のどっちかを読めばいいのかな jane streetのcoreのList.mapってoption付きのリスト返すの? Ocamlで書いた関数はどこまで()を省略していいのか
試行錯誤な気がする。 省略するぐらいなら全部付けとけ
begin endも混ぜると対応のエラーチェックも期待できるぞ Standard ML of New Jersey v110.85 での話なんですが,
exception NO_MEMBER;
fun nth n [] = raise NO_MEMBER
| nth 1 (a::_) = a
| nth n (_::b) = nth (n-1) b ;
と,リストのn番目(先頭1)を取り出す関数を作って,
val third = nth 3;
と3番目を取り出す関数を作ろうとすると,
Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
と怒られますが,なんか回避策あるんでしょうか?
当然,fun third x = nth 3 x; は大丈夫だけど,引数つけずに定義して
やりたかった. ちょいと質問
Haskelは再代入禁止と言う割にはモナドで誤魔化してる感もあるし
モナドだとボックス型のパフォーマンスが極端に悪い(が使わざるを得ない)しで
どうも好きになれなかったんだけど
そもそもあまりにも使いづらすぎる我慢大会かと
Ocamlはその辺うまく解決してるのかな?
なんか上の方見るとクロージャを展開できてないような気もして大丈夫かと思ったりもするけど
CLOSで遊ぶのとどっちがためになるかな?
ふわふわした質問でゴメン そうそうCLOSだと厳密なカプセル化はされてなくて
各インスタンスの変数にダイレクトにアクセスできるかのように読めたのだけど
それが本当だとしたら非常にまずいことだけど
Ocamlだとどうなってるんだろうっていうのも気になってる
正しくないオブジェクト志向(not指向)だったらいらんよね・・ >>33
副作用有ろうが無かろうが、呼ばれる関数からすればいつ、どんな値が来るか分からないと言う意味では同じなのよ。
なので、入り口だけ副作用有る関数はモナド使えば、それ以降は副作用の無い関数と同じにしようってなってる。
遅いのは認める。
関数の外から値が渡される
↓
f x = "hello" ++ x
外部入力から値が渡される
↓
readLine >>= /x -> "hello" ++ x
無限ループの発生源?を最小化して、関数化を進めやすいのは遅延評価の特徴。
import Data.List
import System
main = mapM_ put $ zip hellos marks
hellos = (cycle.tails) "Hello World!!"
marks = cycle ["/","|","\\","--"]
put (x,y) = do putStrLn (x ++ "\n" ++ y)
mapM_ (\_ -> putStr "") [1..50000]
system "clear"
cycle xs = xs ++ mycycle xs そのへんはどうみてもhaskellのほうが考えられてる
MLは別に力入れてない 真のオブジェクト指向は、全てのオブジェクトが独立していてメッセージをやり取りすると言う事のみ
printと言うメッセージが飛んで来たら何かをprintすればいいだけ
ほとんどの言語はメッセージの送信は関数呼び出しになってるけど、CLOSはslot(いわゆるメンバ変数)へのアクセスも必ず関数(総称関数)呼び出しが必要で、ある意味真のオブジェクト指向と言える
そして、その関数をexportしなければslotにアクセス出来ないので、private変数の様な事はちゃんと出来る 久々にReal World OCamlのサイトみたら2nd Edition準備中なんだ。
https://realworldocaml.org/
サイトがめちゃくちゃ見やすくなってて良い感じ。 言語仕様とか理論とかは知らんがhaskellって
mapM_ とか putStrLn とか \_ とか
なんかそういう細かいとこで見た目がイヤ 見た目が嫌いなら仕方ない。
私も見た目でPrologはどうしても愛せなかった。。。 Alpha Lab|学術巨大掲示板群
x0000.net simulationライブラリで純粋な関数式プログラミングを
(純粋な関数式とは、状態あり変数も関数式だ)
ttp://x0000.net/topic.aspx?id=3631-0 ocamlは;がキモくなければHaskellの代わりにバズれたと思う >>46
速くて有名な数値計算ライブラリは大体fortran、次いでocaml(cトランスパイラ)製だし(fftwとか
c直書きで最適なコード書くのなんて人間には不可能なんだろう そもそもHaskellはバズっているのか?
実用性に乏しいけど、見下したい人が我慢して使ってる印象 Haskell 何年か前には確かにバズってた、
みんなモナドについて熱く語ってた(個人の感想)
今はあんまり聞かなくて寂しい… 型指向プログラミング入門にはHaskellは良いと思うよ
代数はあんまり好きじゃない、というか役に立つかよく分からんのでそっちじゃないだろ感はあったけど
広く括ればML系列なんでにわか人気でも悪い気はしないが >>34
いまさらのレス感あるが、たまたま目についたので…
lisp族は関数型オブジェクト指向GC継続AI論理型パターンマッチ等々、おおよその概念の走りというだけ
というかこれだけ挙がるということ即ち無節操
形から入るには全く向いていない
CLOS/MOPは未だに最も強力なシステムだと思うけど、既に確立されてる型/OOP理論とは相反するところがあるし、むしろブチ壊す側
ML系のガチガチ制約を矯正ギプスとしてベストプラクティス&洞察力を養いたいという目的には向いてない まあ向上心があるのならlispインタプリタ書くチュートリアルは一度やっておくべきだと思う
MLお家芸のパーサ書きにも資する CLはもう極端な動的さ以外に特色はないんじゃないか? まあそうだね、schemeは縛りがキツイからアナーキーにやりたいならclって感じ
あとOOP使わず型(最適化ディレクティブとしての型)付ければCと同等のベンチ叩き出すとか 標準文法は決まってるけど、lexerとparserを弄る&乗取る組み込み関数が提供されてて規格より優先順位高いからから、例えcやsqlのコードでも規格準拠のと言い張れたりする
そこまでするなら普通にlexer/perser書いて…言語処理系書けよって話だけど
一部lispで直感的に書きにくいとか、そういう時に/regex/とか{key: val}とか[start:stop:step]のような、モダンっぽいリテラルを簡単に定義できるのは便利 一文字読む毎にその文字に対応する関数呼び出して全権移譲してるんだよな…
さすがにコンパイル時にはユーザー定義で上書きした文字以外はヒューリスティックだろうけど
楽しそうではあるけど言語自体を拡張するよりML式に代数的データ型とパターンマッチでDSL書いた方が早い ちょっと調べたら組み込み関数で先読みは一文字まで?
(set-macro-character #\[ (get-macro-character #\( ))
で[角張った りすぷ)
;; #\(に標準で割り当てられてるマクロ関数が探す終端文字はもちろん#\)
;;なので手抜きだとこうなる
(set-macro-character #\# 改行文字までread-char読み捨て)
# シバンとして読めるコメント文字を定義すると便利そう?
set-dispatch-macro-...で一文字目の文脈で二文字目を解釈
だとしたらcライク構文をlispコードとしてパース/評価までやるのは結構大変なんじゃ
もちろんread-charじゃなく単語単位のトークン分割(標準文法のread関数)、先読みはpeek-char関数を使うとか
バックトラックは評価器に渡す前にバッファに溜め込んでおくとか考えられるが
あんまり詳しくないんで違ってたらすまん Twitterの検索で
@ohagiya @kenokabe UCLA
と入れると楽しいよな プログラミング in OCaml 〜関数型プログラミングの基礎からGUI構築まで〜
と
プログラミングの基礎 (Computer Science Library)
と
コンピュータを操る: プログラミングを通して「情報科学的なものの考え方」を学ぶ (Computer and Web Sciences Library)
いずれかあるいはいくつか読んだことがある方、感想を教えていただけませんでしょうか。
関数型プログラミングにひたったことはないけれど若干知っている、程度なのですが今後のプログラミングや文章を書くときの指針にこの辺りが役立ちそうに思っています。