X



関数型言語ML (SML, OCaml, etc.), Part 7
0001デフォルトの名無しさん
垢版 |
2017/11/01(水) 17:25:35.48ID:6Qf19YDf
関数型言語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/
0011デフォルトの名無しさん
垢版 |
2017/12/28(木) 17:39:41.34ID:N/80jHgY
すべてを関数と見なすだけ
定数も「定数を表す関数」と見なす
immutableかどうかは別の話
0012デフォルトの名無しさん
垢版 |
2018/03/19(月) 08:51:02.12ID:TWWfpY71
初心者質問いいですか
ocamlコマンドでスクリプトみたいにコード走らされるけど、coreを使った途端できなくなりました。
追加でコマンドオプションが必要なのでしょうか?
0014デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:56:35.31ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

KDJWC
0015デフォルトの名無しさん
垢版 |
2018/06/14(木) 23:29:58.98ID:B3Vc0RRX
fableってのが面白そうだ・・・F#からJavascriptに変換してHTML5アプリとか作れるらしい
時間ができたらいじってみようかな
0018デフォルトの名無しさん
垢版 |
2018/06/23(土) 03:37:58.67ID:ADF05MCP
OCamlで質問なんですが、1つのリストに対してmapしてfilterして、またmapしてみたいなことをするとき、
新しいリストがその度に、上の例で言うと3回作られるという認識であってますか?
0019デフォルトの名無しさん
垢版 |
2018/06/23(土) 07:35:44.96ID:0Hl7KNt9
合ってる
それにクロージャを渡すだけでも結構コストがあるので
自分でループ書いたほうが効率がいい
0020デフォルトの名無しさん
垢版 |
2018/06/23(土) 13:51:31.94ID:ADF05MCP
やっぱりそうですか
ありがとうございます
Haskellと違い正格評価なのだから当たり前ですよね
素直にループで書きます
0022デフォルトの名無しさん
垢版 |
2018/06/23(土) 17:36:50.91ID:ADF05MCP
>>21
ありがとうございます
調べてみます
関数型はHaskellから入ってml系は知らないので、ちょっとずつ慣れていきます
0024デフォルトの名無しさん
垢版 |
2018/06/25(月) 08:12:48.99ID:q4Puu0mx
OCamlの関数定義で型を記述するのって、あまり良くないスタイルですか?
同じく型推論してくれるHaskellだと、型を書くのが推奨されてるみたいですが
0025デフォルトの名無しさん
垢版 |
2018/06/25(月) 14:25:12.68ID:NzmJfW7/
ocamlはスタイルの良し悪しを言えるような綺麗な構文してないし
人のコード見てもまちまちなんで、好きに書けばいいよ
0026デフォルトの名無しさん
垢版 |
2018/07/03(火) 07:11:09.58ID:GD+nzmMH
ocamlってどうやって勉強していけばいいんだろ
参考になりそうなコードとか全然見つからないし
「プログラミング in OCaml」か「Real World Ocaml」のどっちかを読めばいいのかな
0029デフォルトの名無しさん
垢版 |
2018/07/05(木) 00:57:09.40ID:RfoszcD2
NTB
0031デフォルトの名無しさん
垢版 |
2018/09/05(水) 19:17:32.47ID:6/0ZHi8J
省略するぐらいなら全部付けとけ
begin endも混ぜると対応のエラーチェックも期待できるぞ
0032デフォルトの名無しさん
垢版 |
2019/05/11(土) 10:46:27.70ID:uCzBZMLg
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; は大丈夫だけど,引数つけずに定義して
やりたかった.
0033デフォルトの名無しさん
垢版 |
2019/08/15(木) 02:29:49.06ID:km/ot4Ek
ちょいと質問
Haskelは再代入禁止と言う割にはモナドで誤魔化してる感もあるし
モナドだとボックス型のパフォーマンスが極端に悪い(が使わざるを得ない)しで
どうも好きになれなかったんだけど
そもそもあまりにも使いづらすぎる我慢大会かと

Ocamlはその辺うまく解決してるのかな?
なんか上の方見るとクロージャを展開できてないような気もして大丈夫かと思ったりもするけど
CLOSで遊ぶのとどっちがためになるかな?

ふわふわした質問でゴメン
0034デフォルトの名無しさん
垢版 |
2019/08/15(木) 02:34:51.29ID:km/ot4Ek
そうそうCLOSだと厳密なカプセル化はされてなくて
各インスタンスの変数にダイレクトにアクセスできるかのように読めたのだけど
それが本当だとしたら非常にまずいことだけど
Ocamlだとどうなってるんだろうっていうのも気になってる

正しくないオブジェクト志向(not指向)だったらいらんよね・・
0036デフォルトの名無しさん
垢版 |
2019/09/01(日) 00:36:10.57ID:3Spoi/4/
>>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
0037デフォルトの名無しさん
垢版 |
2019/09/01(日) 00:53:30.18ID:sYwYgS29
圏論ωωω
0040デフォルトの名無しさん
垢版 |
2019/09/25(水) 14:10:29.52ID:/4tfHXau
真のオブジェクト指向は、全てのオブジェクトが独立していてメッセージをやり取りすると言う事のみ
printと言うメッセージが飛んで来たら何かをprintすればいいだけ
ほとんどの言語はメッセージの送信は関数呼び出しになってるけど、CLOSはslot(いわゆるメンバ変数)へのアクセスも必ず関数(総称関数)呼び出しが必要で、ある意味真のオブジェクト指向と言える
そして、その関数をexportしなければslotにアクセス出来ないので、private変数の様な事はちゃんと出来る
0042デフォルトの名無しさん
垢版 |
2020/03/01(日) 09:25:45.35ID:JWAFHnbA
言語仕様とか理論とかは知らんがhaskellって
mapM_ とか putStrLn とか \_ とか
なんかそういう細かいとこで見た目がイヤ
0043デフォルトの名無しさん
垢版 |
2020/03/01(日) 14:40:02.44ID:upDpA/6g
見た目が嫌いなら仕方ない。
私も見た目でPrologはどうしても愛せなかった。。。
0044デフォルトの名無しさん
垢版 |
2020/03/01(日) 15:19:00.53ID:IAGr/PH/
Alpha Lab|学術巨大掲示板群
x0000.net
0045デフォルトの名無しさん
垢版 |
2020/03/01(日) 15:22:58.85ID:IAGr/PH/
simulationライブラリで純粋な関数式プログラミングを
(純粋な関数式とは、状態あり変数も関数式だ)
ttp://x0000.net/topic.aspx?id=3631-0
0048デフォルトの名無しさん
垢版 |
2021/01/15(金) 02:58:21.61ID:Hai3vgIl
>>46
速くて有名な数値計算ライブラリは大体fortran、次いでocaml(cトランスパイラ)製だし(fftwとか
c直書きで最適なコード書くのなんて人間には不可能なんだろう
0049デフォルトの名無しさん
垢版 |
2021/01/15(金) 21:45:59.26ID:lcwEKr0P
そもそもHaskellはバズっているのか?
実用性に乏しいけど、見下したい人が我慢して使ってる印象
0050デフォルトの名無しさん
垢版 |
2021/01/27(水) 11:13:03.05ID:bXbG36lK
Haskell 何年か前には確かにバズってた、
みんなモナドについて熱く語ってた(個人の感想)

今はあんまり聞かなくて寂しい…
0051デフォルトの名無しさん
垢版 |
2021/02/18(木) 08:08:11.33ID:2agUMJ25
型指向プログラミング入門にはHaskellは良いと思うよ
代数はあんまり好きじゃない、というか役に立つかよく分からんのでそっちじゃないだろ感はあったけど
広く括ればML系列なんでにわか人気でも悪い気はしないが
0052デフォルトの名無しさん
垢版 |
2021/02/18(木) 08:31:52.28ID:2agUMJ25
>>34
いまさらのレス感あるが、たまたま目についたので…
lisp族は関数型オブジェクト指向GC継続AI論理型パターンマッチ等々、おおよその概念の走りというだけ
というかこれだけ挙がるということ即ち無節操
形から入るには全く向いていない

CLOS/MOPは未だに最も強力なシステムだと思うけど、既に確立されてる型/OOP理論とは相反するところがあるし、むしろブチ壊す側
ML系のガチガチ制約を矯正ギプスとしてベストプラクティス&洞察力を養いたいという目的には向いてない
0053デフォルトの名無しさん
垢版 |
2021/02/18(木) 08:37:50.68ID:2agUMJ25
まあ向上心があるのならlispインタプリタ書くチュートリアルは一度やっておくべきだと思う
MLお家芸のパーサ書きにも資する
0055デフォルトの名無しさん
垢版 |
2021/02/19(金) 04:14:17.89ID:MujNk0Cy
まあそうだね、schemeは縛りがキツイからアナーキーにやりたいならclって感じ
あとOOP使わず型(最適化ディレクティブとしての型)付ければCと同等のベンチ叩き出すとか
0056デフォルトの名無しさん
垢版 |
2021/02/19(金) 04:35:24.37ID:MujNk0Cy
標準文法は決まってるけど、lexerとparserを弄る&乗取る組み込み関数が提供されてて規格より優先順位高いからから、例えcやsqlのコードでも規格準拠のと言い張れたりする

そこまでするなら普通にlexer/perser書いて…言語処理系書けよって話だけど
一部lispで直感的に書きにくいとか、そういう時に/regex/とか{key: val}とか[start:stop:step]のような、モダンっぽいリテラルを簡単に定義できるのは便利
0057デフォルトの名無しさん
垢版 |
2021/03/08(月) 15:26:00.22ID:H4OoIpXQ
一文字読む毎にその文字に対応する関数呼び出して全権移譲してるんだよな…
さすがにコンパイル時にはユーザー定義で上書きした文字以外はヒューリスティックだろうけど
楽しそうではあるけど言語自体を拡張するよりML式に代数的データ型とパターンマッチでDSL書いた方が早い
0058デフォルトの名無しさん
垢版 |
2021/03/08(月) 15:52:44.32ID:H4OoIpXQ
ちょっと調べたら組み込み関数で先読みは一文字まで?
(set-macro-character #\[ (get-macro-character #\( ))
で[角張った りすぷ)
;; #\(に標準で割り当てられてるマクロ関数が探す終端文字はもちろん#\)
;;なので手抜きだとこうなる
(set-macro-character #\# 改行文字までread-char読み捨て)
# シバンとして読めるコメント文字を定義すると便利そう?

set-dispatch-macro-...で一文字目の文脈で二文字目を解釈
だとしたらcライク構文をlispコードとしてパース/評価までやるのは結構大変なんじゃ
もちろんread-charじゃなく単語単位のトークン分割(標準文法のread関数)、先読みはpeek-char関数を使うとか
バックトラックは評価器に渡す前にバッファに溜め込んでおくとか考えられるが

あんまり詳しくないんで違ってたらすまん
0059デフォルトの名無しさん
垢版 |
2022/01/12(水) 10:26:17.27ID:ZZU00ODL
Twitterの検索で

@ohagiya @kenokabe UCLA

と入れると楽しいよな
0060デフォルトの名無しさん
垢版 |
2022/11/26(土) 20:46:31.99ID:9B2aEYlu
プログラミング in OCaml 〜関数型プログラミングの基礎からGUI構築まで〜

プログラミングの基礎 (Computer Science Library)

コンピュータを操る: プログラミングを通して「情報科学的なものの考え方」を学ぶ (Computer and Web Sciences Library)
いずれかあるいはいくつか読んだことがある方、感想を教えていただけませんでしょうか。
関数型プログラミングにひたったことはないけれど若干知っている、程度なのですが今後のプログラミングや文章を書くときの指針にこの辺りが役立ちそうに思っています。
レスを投稿する


ニューススポーツなんでも実況