ML!!!!!!
■ このスレッドは過去ログ倉庫に格納されています
0001あなたの近くの名無しさん
NGNGこの掲示板の人なら知ってるかなと…
な〜んてね
0159デフォルトの名無しさん
NGNGMLでMLの処理系書いてみるよろし。
'a list ->'b list じゃ駄目だよ。
それだと例えば (1 + flat [1,2,3]) がOKになっちゃう。
これは155や157みたいに少し構造を複雑にしないと
出来ないと思う。
0161160
NGNG例は (hd flat['a'] + 1) にしてください。
0162デフォルトの名無しさん
NGNG> S式の型が弱いってのがわからない。
(int list) list, int list, etc.をまとめて一つの構造で扱うので、
"int list"として扱うxに対して、head (head x)がcompile時にerrorとならない。
これはデータの持つ特徴を、型にabstractし損なっている、ということになる。
もちろん、>>156の様でないといけない局面では「弱い」とは言えないし、
Lispは、この柔軟さを構文の柔軟さとし、武器とした。
0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNG0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNG0167デフォルトの名無しさん
NGNG0168デフォルトの名無しさん
NGNG0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNGSML/NJより格段に速いそうだけどちょっとSyntaxが違うみたい。
0174デフォルトの名無しさん
NGNG実際はどんなもん?Haskellの翻訳本なんて
ないけどMLならある。でもここじゃHaskellだよね。
不思議・・
0175デフォルトの名無しさん
NGNG非正格のHaskellも気にはなりますが、一番好きな言語はMLです。SMLは、やはり好きな言語のSchemeを強力にしたもののように思えるからです。
今は大堀先生の本を読んでいます。
0176デフォルトの名無しさん
NGNGでHaskellはそうだとか。
Side effectが無いかどうかなんだと。
Ocamlなんてさら脱線してるし。
でもHaskellは普及しないと思う。
Closureの機能をコンパイルするのはそれ程大変ではないが
Lazy evaluationのコンパイラは一般のプログラマには
理解しにくいだろうというのが一つの理由。
0177デフォルトの名無しさん
NGNG0178デフォルトの名無しさん
NGNGocaml使ってます。syntaxは違いますが慣れました(ML -> Ocamlで入った)。
目立つ違いは宣言まわりかな? SMLのトップレヴェル宣言
val x = ...
fun f x = ...
fun f x = ...f...
はそれぞれOcamlでは
let x = ...
let f x = ...
let rec f x = ...f...
になります。定数と関数の宣言をどちらもletで行ないます。再帰関数の宣言
の時だけrecを入れる必要があります。Ocamlの局所宣言はletに続けてin (式)
とします。SMLのようにendで閉じる必要はありません。
あとdatatypeのコンストラクタは必ず大文字で始めるというのも最初は戸惑い
ました。
(SML) datatype 'a tree = leaf | node of 'a * 'a tree * 'a tree
(Ocaml) type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree
他にもいろいろありますがとりあえず。
[email protected]
0179178
NGNG0180デフォルトの名無しさん
NGNGニチャンテトキドキコウイウヒトイルカラコワイ
0181デフォルトの名無しさん
NGNGゴメンナサイ
0183デフォルトの名無しさん
NGNG禿胴 ...
0184デフォルトの名無しさん
NGNGhttp://www.kaba.or.jp/htbin/wwwfinger?person=sinya
こういう人を見ると自分のヘボさを実感します。
0185デフォルトの名無しさん
NGNGな〜んてね
0186デフォルトの名無しさん
NGNG0187178
NGNG条件反射でやってしまった (´Д`) はぁー鬱
他にもOcamlにはオーバーロードが無いので
3 + 2, 3.0 +. 2.0 など区別して書きます。
実数を扱うプログラムを書く時など、ちょっと気になるかも...
0188デフォルトの名無しさん
NGNGしかし=は未だオーバーロードされているようで。
0189178
NGNG> しかし=は未だオーバーロードされているようで。
そうでした。>>187は言いすぎでした (鬱死
「+,-,/,*,符号反転といった演算子はオーバーロードされてない」と訂正します。
...反省すると、型システムはオーバーロードを考慮して作られていません、
ということが言いたかったのでした。
このためOcamlでは = や < などの比較演算に'a->'a->boolという型を持たせ
ることでオーバーロードを実現しています。こうすれば(整数) < (整数) と
(実数) < (実数) が同時に型チェックを通るのでよいのですが、一方で < が
未定義な引数が来てもそれを通してしまいます。例えば(fun x -> x) < (fun
x -> x) は実行できて、例外を発生します。この点、SMLでは型システムが <
の定義されている型を知っているのでこれを型エラーにします。
0190デフォルトの名無しさん
NGNGttp://a414s1.it.nanzan-u.ac.jp/smlbook/smlwww/node12.html
を見つつお勉強してるんですが、
ここに載ってる例の、
exception Get_nth;
fun get_nth _ nil = raise Get_nth
|get_nth 1 (front :: _) = front
|get_nth n (_ :: rest) = get_nth (n-1) rest;
val get_third = get_nth 3;
というのが、smlで
stdIn:7.1-7.22 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val get_3 = fn : ?.X1 list -> ?.X1
と言われて動きません。
moscow ml だと
! Warning: Value polymorphism:
! Free type variable(s) at top level in value identifier get3
と言われつつも動くのですが。
なんでですか?
Standard ML of New Jersey v110.9.1 [FLINT v1.41], October 19, 1998
Moscow ML version 2.00 (June 2000)
NetBSD 1.5ZA
にて。
0191デフォルトの名無しさん
NGNG0192190
NGNG>191は私に対する回答ですか?
タプルなんて出てこないと思うのですが...。
タプルって(a,b)みたいなやつですよね?
0193デフォルトの名無しさん
NGNG折もわからんのだが、
fun get_third xs = get_nth 3 xs
ならうまくいくねぇ。どうしてなんだろ。
0194デフォルトの名無しさん
NGNG部分適用で多相的な関数を宣言するのはSML97では無理じゃないかな?
val get_third' = (fn l => get_nth 3 l) とか、これに同値な宣言
fun get_third' l = get_nth 3 l
なら'a list->'aになりますが...というのは:
SML97にはvalue polymorphismというものが導入されました。これは、「宣言
val x = eのxが多相型を持つのはeがnon-expansiveな式であるときに限る」と
いうものです。
non-expansiveな式とはおおざっぱにいって定数、変数、関数抽象、
non-expansiveな式からなるタプルやレコード、そしてnon-expansiveな式が与
えられたコンストラクタ(refを除く)からなります。それ以外、例えば関数呼
び出しはnon-expansiveではありません。
>>190でWarningが出るのは、get_thirdの型を多相的にしようとしたところ、
get_nth 3がnon-expansiveな式ではなかったためです。一方冒頭の例では
non-expansiveな式でget_third'を宣言しているのでうまくいきます。
できなかった時にget_thirdの型がどうなるか、については省略します。ただ
し、SML/NJとMosmlでは扱いが微妙に異なるため>>190のように挙動が違います。
ちなみにMosmlでget_thirdを定義してget_third [1,2,3]を計算した後
get_thirdの型を見ると...
0195デフォルトの名無しさん
NGNG「fun get_third xs = get_nth 3 xs が良くて
val get_third = get_nth 3 がだめなのは仕様です。」
0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNG関数型プログラミング言語ML
http://pc.2ch.net/test/read.cgi/tech/1012445015/
以後はこちらで。
0200200
NGNGそして、終了!!!!!!
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNGでも良スレでした。
0203デフォルトの名無しさん
NGNG関数型プログラミング言語ML
http://pc.2ch.net/test/read.cgi/tech/1012445015/
以後はこちらで。
引越しの原因は >>1の説明の不備による混乱。
また、このスレの説明ではMLをまだ知らない人がMLを始めることはないでしょう。
■ このスレッドは過去ログ倉庫に格納されています