関数型言語MLについて語るスレッドです。
MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/
前スレ
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/
探検
関数型言語ML (SML, OCaml, etc.), Part 6
■ このスレッドは過去ログ倉庫に格納されています
2009/06/15(月) 07:15:21
486デフォルトの名無しさん
2011/09/29(木) 15:11:00.44487デフォルトの名無しさん
2011/09/29(木) 15:56:30.36 >>485
このテキストの17章
http://www.scala-lang.org/docu/files/ScalaByExample.pdf
タイガー本の16章
http://www.cs.princeton.edu/~appel/modern/ml/
このテキストの17章
http://www.scala-lang.org/docu/files/ScalaByExample.pdf
タイガー本の16章
http://www.cs.princeton.edu/~appel/modern/ml/
488365
2011/09/29(木) 18:07:57.87 >>485
Prolog で型チェック:Rainy Day Codings:So-net blog
http://rainyday.blog.so-net.ne.jp/2008-06-16
題名は型チェックだけど、コードはまぎれもなく型推論
Prolog で型チェック:Rainy Day Codings:So-net blog
http://rainyday.blog.so-net.ne.jp/2008-06-16
題名は型チェックだけど、コードはまぎれもなく型推論
489デフォルトの名無しさん
2011/09/29(木) 19:09:02.35 ああPrologだから単一化で型推論が起きるのか。
490デフォルトの名無しさん
2011/10/04(火) 18:43:07.61 prologで型推定が一番楽にできそう
しかし返値しか推定してないね
しかし返値しか推定してないね
491デフォルトの名無しさん
2011/10/06(木) 15:33:53.10 SMLやろうと思うんだけど、関数書いたファイルはどこ入れときゃいいの?
492デフォルトの名無しさん
2011/10/06(木) 19:31:29.68 WinにもOCaml3.12.1きてるー
ttp://gallium.inria.fr/~protzenk/caml-installer.html
ttp://gallium.inria.fr/~protzenk/caml-installer.html
493sage
2011/10/06(木) 20:07:16.49 >>492
SML/NJの場合だと、適当なファイル(例えばhoge.sml)に保存して、保存した
フォルダでNJの対話環境を起動して、
use "hoge.sml"
とすればよい。useはカレントディレクトリからソースを読み込む関数で、
カレントディレクトリの取得/変更は、
OS.FileSys.getDirとOS.FileSys.chDirでできる。
SML/NJの場合だと、適当なファイル(例えばhoge.sml)に保存して、保存した
フォルダでNJの対話環境を起動して、
use "hoge.sml"
とすればよい。useはカレントディレクトリからソースを読み込む関数で、
カレントディレクトリの取得/変更は、
OS.FileSys.getDirとOS.FileSys.chDirでできる。
494デフォルトの名無しさん
2011/10/06(木) 21:24:34.13 >>493
ありがとう!
ありがとう!
495デフォルトの名無しさん
2011/10/11(火) 22:10:01.73496デフォルトの名無しさん
2011/10/13(木) 22:44:28.70 型推論があるから簡潔になるのか
パターンマッチがあるから簡潔になるのか
パターンマッチがあるから簡潔になるのか
497デフォルトの名無しさん
2011/10/13(木) 22:47:43.98 両方
498デフォルトの名無しさん
2011/10/13(木) 23:19:58.73 高階関数とカリー化も簡潔に書くのに一役買ってる
499デフォルトの名無しさん
2011/10/14(金) 07:40:42.96500デフォルトの名無しさん
2011/10/14(金) 07:48:35.09 The C# code, while functionally equivalent, looks cluttered,
with the real structure obscured by syntactic noise.
事実だけど、辛辣だな。
with the real structure obscured by syntactic noise.
事実だけど、辛辣だな。
501デフォルトの名無しさん
2011/10/14(金) 11:38:18.36502デフォルトの名無しさん
2011/10/14(金) 21:38:01.24 >>501
なるほど、ML系かぁ。そういわれれば納得です。
なるほど、ML系かぁ。そういわれれば納得です。
503デフォルトの名無しさん
2011/10/14(金) 22:41:41.95 C#とかJavaとかはジェネリックが狂ってるな
504デフォルトの名無しさん
2011/10/16(日) 05:15:33.48 js_of_ocaml が面白そうだな
505デフォルトの名無しさん
2011/10/19(水) 21:52:08.21 ocamlてmain関数的なエントリポイントって無いの?
Pythonみたいな泥臭い方法でもいいんだけど.
Pythonみたいな泥臭い方法でもいいんだけど.
506デフォルトの名無しさん
2011/10/20(木) 12:56:49.09 具体的に OCaml で何をしたいのか、Python のどこがダサいのか
書いた方が答をもらいやすいよ
書いた方が答をもらいやすいよ
507デフォルトの名無しさん
2011/10/20(木) 14:05:46.81 >>505
OCamlにエントリポイントはないです。__main__とかないです。
ocamlc -o a.out a.ml b.ml c.mlとしてコンパイルすると、
a.outの動きとしてはmodule A,B,Cの順番で評価されるイメージになります。
OCamlにエントリポイントはないです。__main__とかないです。
ocamlc -o a.out a.ml b.ml c.mlとしてコンパイルすると、
a.outの動きとしてはmodule A,B,Cの順番で評価されるイメージになります。
508デフォルトの名無しさん
2011/11/06(日) 03:27:50.02 最近HaskellからOCamlに興味を持って少し触り始めたんですが,OCamlの対話環境にはghciの「:i 」みたいなものは無いんでしょうか?
509デフォルトの名無しさん
2011/11/06(日) 06:11:24.22 「なぜ次に学ぶ言語は関数型であるべきか」
http://d.hatena.ne.jp/ymotongpoo/20111105/1320506449
原文: http://queue.acm.org/detail.cfm?id=2038036
http://d.hatena.ne.jp/ymotongpoo/20111105/1320506449
原文: http://queue.acm.org/detail.cfm?id=2038036
510デフォルトの名無しさん
2011/11/06(日) 22:31:50.25 toplevel の pretty printer を普通のプログラム内で使う方法ってありますか。
511デフォルトの名無しさん
2011/11/07(月) 22:42:07.36512デフォルトの名無しさん
2011/11/12(土) 05:42:33.31 >>510 #install_printer のやつ?
513デフォルトの名無しさん
2011/11/12(土) 05:53:40.36 >>510 言語は?
514デフォルトの名無しさん
2011/11/19(土) 10:47:17.91 http://scan.netsecurity.ne.jp/article/img/2011/11/13/27625/93.html
tokuhirom、ma.la?っていう人の話だけ聞きたい
色々なスレで見かけるけどWEB業界で有名らしいね
動画ありませんか?
tokuhirom、ma.la?っていう人の話だけ聞きたい
色々なスレで見かけるけどWEB業界で有名らしいね
動画ありませんか?
515デフォルトの名無しさん
2011/11/23(水) 00:53:05.05 The little MLerの情報って調べたけど少ないね。大学の図書館
とかなら有りそうに思うけど、今は大学と関係ないから探せんわ。
SML中心で書いてるようだ。Ocamlへの改変の仕方ものってる
というのはgoogle booksでわかった。
使って学習した人っておらんの?
とかなら有りそうに思うけど、今は大学と関係ないから探せんわ。
SML中心で書いてるようだ。Ocamlへの改変の仕方ものってる
というのはgoogle booksでわかった。
使って学習した人っておらんの?
516デフォルトの名無しさん
2011/11/23(水) 09:07:06.79 NACSIS Webcatで検索するか買えば?
面白いよ。
面白いよ。
517デフォルトの名無しさん
2011/11/23(水) 14:49:34.72 NACSIS Webcatか
http://webcat.nii.ac.jp/cgi-bin/shsproc?id=BA3501073X
意外とおいてるところ少ないね。今学習してる本が片付いたら
購入検討するわ。
http://webcat.nii.ac.jp/cgi-bin/shsproc?id=BA3501073X
意外とおいてるところ少ないね。今学習してる本が片付いたら
購入検討するわ。
518デフォルトの名無しさん
2011/11/23(水) 15:07:11.14519デフォルトの名無しさん
2011/12/10(土) 10:15:38.86 age
520デフォルトの名無しさん
2011/12/18(日) 01:18:07.20 MLってCACHEに使われてるんだっけ?
RDBでないDBに興味を持ったので調べ始めたんだけど、 ML、CACHEとも事例が中々見つからない...
RDBでないDBに興味を持ったので調べ始めたんだけど、 ML、CACHEとも事例が中々見つからない...
521デフォルトの名無しさん
2012/01/02(月) 00:09:12.82 OCaml のモジュールについて質問です.
たとえば
A.B
A.C
A.D
みたいにネストしたモジュールをそれぞれ分割されたファイル(a/b.ml, a/c.ml, a/d.ml など階層化されたディレクトリに分けられる?)に書くには OCaml ではどういう方法が一般的でしょうか?
たとえば
A.B
A.C
A.D
みたいにネストしたモジュールをそれぞれ分割されたファイル(a/b.ml, a/c.ml, a/d.ml など階層化されたディレクトリに分けられる?)に書くには OCaml ではどういう方法が一般的でしょうか?
522デフォルトの名無しさん
2012/01/19(木) 07:56:03.89 ocamlc -pack
2012/03/29(木) 00:44:48.75
524デフォルトの名無しさん
2012/04/22(日) 14:29:24.78 MLの無名関数 (fn x => x + 1 みたいなの)って再帰的な定義をする記法はないのですか?
fn n => n * (fn n-1) みたいな感じで。
fn n => n * (fn n-1) みたいな感じで。
525デフォルトの名無しさん
2012/04/22(日) 17:17:03.18 >>524
どうしてもやりたいならY combinatorを定義して使うとか:
let rec y f x = f (y f) x;;
(y (fun f x -> match x with 0 -> 1 | n -> n * f (n-1))) 10;;
どうしてもやりたいならY combinatorを定義して使うとか:
let rec y f x = f (y f) x;;
(y (fun f x -> match x with 0 -> 1 | n -> n * f (n-1))) 10;;
526デフォルトの名無しさん
2012/04/23(月) 08:12:58.62527デフォルトの名無しさん
2012/04/23(月) 20:37:41.35 SML/NJでdatatype 'a tree = Empty | Node of 'a * 'a tree * 'a treeとかやっといて、適当な深い木を定義してやると
表示が"Node #"と出てきて省略されてしまうんだけど、略記せずに全部出力させる方法があれば教えて。
表示が"Node #"と出てきて省略されてしまうんだけど、略記せずに全部出力させる方法があれば教えて。
528デフォルトの名無しさん
2012/04/23(月) 21:20:09.21 自分でプリンタ書けよ
529デフォルトの名無しさん
2012/04/27(金) 00:54:20.88 camlp4 使った奴でよくみる pa_* な名前の奴の pa って何の略なんだ?
530デフォルトの名無しさん
2012/04/29(日) 02:59:34.92531デフォルトの名無しさん
2012/04/30(月) 15:05:27.19 >>530
おお、ありがとう!
おお、ありがとう!
532デフォルトの名無しさん
2012/05/08(火) 20:26:45.44 >>527
以下2つに適当に大きな数字を書き込む。
Control.Print.printLength;
Control.Print.printDepth;
あと、
Control.Print.out
も便利。何もしない関数に置き換えると、エコーバックを消せる。
以下2つに適当に大きな数字を書き込む。
Control.Print.printLength;
Control.Print.printDepth;
あと、
Control.Print.out
も便利。何もしない関数に置き換えると、エコーバックを消せる。
533デフォルトの名無しさん
2012/06/07(木) 13:35:08.25 ttp://www.amazon.co.jp/Modern-Functional-Programming-Chris-Reade/dp/0201648644/ref=sr_1_2?s=english-books&ie=UTF8&qid=1339043582&sr=1-2
www
www
534デフォルトの名無しさん
2012/06/07(木) 13:40:40.11 どこからつっこめばいいの…w
535デフォルトの名無しさん
2012/06/07(木) 17:40:09.00 > 掲載画像とお届けする商品の表紙が異なる場合があります。ご了承ください。
とあるけど、どういうことだろう
とあるけど、どういうことだろう
536デフォルトの名無しさん
2012/06/07(木) 21:01:28.02 オリンピックをもう一回
537デフォルトの名無しさん
2012/06/11(月) 15:25:00.19 300?
538デフォルトの名無しさん
2012/07/25(水) 19:10:23.62539デフォルトの名無しさん
2012/07/25(水) 20:56:09.52 OCamlで
int_of_float -0.7;;
がエラーになるんですが、どうして?
Error: This expression has type float -> int
but an expression was expected of type int
ちなみに、、
# int_of_float 0.7;;
- : int = 0
# -0.7;;
- : float = -0.7
-0.7はfloatじゃないの?何がダメなの?
int_of_float -0.7;;
がエラーになるんですが、どうして?
Error: This expression has type float -> int
but an expression was expected of type int
ちなみに、、
# int_of_float 0.7;;
- : int = 0
# -0.7;;
- : float = -0.7
-0.7はfloatじゃないの?何がダメなの?
540デフォルトの名無しさん
2012/07/25(水) 21:13:02.20 中置関数 (-) : int -> int -> int
ががっつり int_of_float を引数に取っているわけで。
int_of_float (-0.7) で使ってください。
ががっつり int_of_float を引数に取っているわけで。
int_of_float (-0.7) で使ってください。
541デフォルトの名無しさん
2012/07/25(水) 22:13:31.14542デフォルトの名無しさん
2012/07/28(土) 13:56:10.63 >>541
~-.0.7 と書いても良いね
~-.0.7 と書いても良いね
543デフォルトの名無しさん
2012/07/29(日) 11:24:50.70 いつの間にか OCaml4.00.0
544デフォルトの名無しさん
2012/07/29(日) 12:34:47.25 岡村4.00.0
545デフォルトの名無しさん
2012/07/30(月) 17:15:20.50 OCaml
コンパイルして、nativeなコード吐いて、不思議な実行のさせかたしてるのね
コンパイルして、nativeなコード吐いて、不思議な実行のさせかたしてるのね
546デフォルトの名無しさん
2012/07/30(月) 22:50:31.73 どのへんが不思議なんだ?
547デフォルトの名無しさん
2012/08/12(日) 14:06:23.13 わからない?
548デフォルトの名無しさん
2012/08/12(日) 23:04:07.50 わからない。教えて下さい。お願いします。
549デフォルトの名無しさん
2012/08/13(月) 00:04:10.53 #!/usr/bin/ocamlrun
550デフォルトの名無しさん
2012/08/13(月) 01:29:14.36 nativeの意味を取り違えてない?
551デフォルトの名無しさん
2012/08/13(月) 03:03:42.64 スクリプトじゃないのはdumpすればわかるでしょ
552デフォルトの名無しさん
2012/08/13(月) 11:53:42.11553デフォルトの名無しさん
2012/08/29(水) 23:04:20.96 ねんがんのLittle MLerをてにいれたぞ
OCamlの場合の読み替え方法も載ってるけど、素直にSMLでやった方が良いのかな
てか読んでる人はいるんだろうか・・・
OCamlの場合の読み替え方法も載ってるけど、素直にSMLでやった方が良いのかな
てか読んでる人はいるんだろうか・・・
554デフォルトの名無しさん
2012/09/02(日) 03:59:59.39 以下の関数でprint_int x という文を入れると構文エラーになってしまうのですが、何がいけないのでしょうか?
let hoge x =
print_int x ← これ
if x=0 then 0
else x + 10
let test1 = hoge 0 = 0
let test2 = hoge 10 = 20
# #use "printtest.ml";;
File "printtest.ml", line 3, characters 4-6:
Error: Syntax error ← 原因は?
let hoge x =
print_int x ← これ
if x=0 then 0
else x + 10
let test1 = hoge 0 = 0
let test2 = hoge 10 = 20
# #use "printtest.ml";;
File "printtest.ml", line 3, characters 4-6:
Error: Syntax error ← 原因は?
555デフォルトの名無しさん
2012/09/02(日) 08:57:34.05 print_int x;
556デフォルトの名無しさん
2012/09/02(日) 10:39:53.93557デフォルトの名無しさん
2012/09/02(日) 10:47:02.65 ocamlか。おかのコードはごみごみしくて醜いな
558デフォルトの名無しさん
2012/09/02(日) 10:53:23.84 print_string "あ、OCamlです。言ってませんでしたね。すいません¥n";
559デフォルトの名無しさん
2012/09/02(日) 15:19:34.02 >>556
インタプリタの文の区切りは ;; (セミコロンが2つ)
逐次実行は ; (この場合セミコロンの前の式の型が unit でない場合警告が出る)
配列の区切りも ; (これは配列の括弧 [ ] の中でのみ出現する)
インタプリタの文の区切りは ;; (セミコロンが2つ)
逐次実行は ; (この場合セミコロンの前の式の型が unit でない場合警告が出る)
配列の区切りも ; (これは配列の括弧 [ ] の中でのみ出現する)
560デフォルトの名無しさん
2012/09/28(金) 23:37:26.16 .net におけるOcamlがF#ですが、
JVM上でのOcaml相当のものはないのでしょうか?
JVM上でのOcaml相当のものはないのでしょうか?
561デフォルトの名無しさん
2012/09/29(土) 11:26:57.28 OCaml-Javaは? http://ocamljava.x9c.fr/
562デフォルトの名無しさん
2012/09/30(日) 17:21:46.18563デフォルトの名無しさん
2012/10/03(水) 00:49:32.12 http://www.lexifi.com/ml2012/
今年のMLワークショップでもocaml-javaの紹介してたみたい。
どのぐらい出来てるんだろう。
パフォーマンスの話も載ってた。
1/3ぐらい?
今年のMLワークショップでもocaml-javaの紹介してたみたい。
どのぐらい出来てるんだろう。
パフォーマンスの話も載ってた。
1/3ぐらい?
564デフォルトの名無しさん
2012/10/12(金) 11:22:15.18 # type t = int * t;;
Error: The type abbreviation u is cyclic
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# type u = u option;;
Error: The type abbreviation u is cyclic
# type u = Some of u | None;;
type u = Some of u | None
だれか解説してくれ。
Error: The type abbreviation u is cyclic
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# type u = u option;;
Error: The type abbreviation u is cyclic
# type u = Some of u | None;;
type u = Some of u | None
だれか解説してくれ。
565デフォルトの名無しさん
2012/10/12(金) 12:17:07.41 >>563
http://shootout.alioth.debian.org/
の中くらいのサイズのやつを8つベンチマーク。
0.96倍から7.14倍の実行速度。
3倍内に収まったのが6つあるぜ。
intを扱うベンチが遅い。boxingされちゃうから。
そういうベンチを省くと平均で倍は遅くない。
http://shootout.alioth.debian.org/
の中くらいのサイズのやつを8つベンチマーク。
0.96倍から7.14倍の実行速度。
3倍内に収まったのが6つあるぜ。
intを扱うベンチが遅い。boxingされちゃうから。
そういうベンチを省くと平均で倍は遅くない。
566デフォルトの名無しさん
2012/10/12(金) 12:26:46.91567デフォルトの名無しさん
2012/10/12(金) 17:55:16.91 >>564
(**** スマンがOCamlは久しく触っていないので、SMLで解説してみる -- 処理系は SML/NJ ****)
- type t = int * t;
Error: unbound type constructor: t
(* まだ束縛されていない型構成子 t を右辺の型式内で参照しているからエラー *)
- type t = { x: int, y: t};
Error: unbound type constructor: t
(* 最初の例と同様に、型構成子 t はまだ束縛されていないのでエラー *)
- type u = u option;
Error: unbound type constructor: u
(* これも同じ理由でエラー *)
- datatype u = Some of u | None;
datatype u = None | Some of u
(* 上記のtype宣言文とは異なり、datatype宣言文であれば再帰的なデータ型定義が許されている *)
(**** 以上だけど、SMLなら不可解な振る舞いは無く、現象を明解に説明できるよ.... ****)
(**** スマンがOCamlは久しく触っていないので、SMLで解説してみる -- 処理系は SML/NJ ****)
- type t = int * t;
Error: unbound type constructor: t
(* まだ束縛されていない型構成子 t を右辺の型式内で参照しているからエラー *)
- type t = { x: int, y: t};
Error: unbound type constructor: t
(* 最初の例と同様に、型構成子 t はまだ束縛されていないのでエラー *)
- type u = u option;
Error: unbound type constructor: u
(* これも同じ理由でエラー *)
- datatype u = Some of u | None;
datatype u = None | Some of u
(* 上記のtype宣言文とは異なり、datatype宣言文であれば再帰的なデータ型定義が許されている *)
(**** 以上だけど、SMLなら不可解な振る舞いは無く、現象を明解に説明できるよ.... ****)
568デフォルトの名無しさん
2012/10/12(金) 18:44:39.63 >>564
abbreviationではない新しい型がcyclicかどうかは仕様を決める人が自由に決める
一方、タプルとoptionがcyclicではないという仕様は既に決まっているので
タプルのabbreviationとoptionのabbreviationはcyclicではないはず
abbreviationではない新しい型がcyclicかどうかは仕様を決める人が自由に決める
一方、タプルとoptionがcyclicではないという仕様は既に決まっているので
タプルのabbreviationとoptionのabbreviationはcyclicではないはず
569デフォルトの名無しさん
2012/10/12(金) 19:52:28.31 >>565
おお、ちゃんと動くもんなんだね!
おお、ちゃんと動くもんなんだね!
570デフォルトの名無しさん
2012/10/13(土) 10:18:23.39 おお。皆さん回答ありがとう。
>> 566
値を作れないわけではなかったりする。
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# let rec loop () = loop ();;
val loop : unit -> 'a = <fun>
# { x = 0; y = { x = 1; y = loop () } };;
いや、作れてはいないんだけど、型は付く。
CPS っぽい感じのプログラムで最後に exit するような場合、こういう型が出現することもある…気がする。
tuple で許されず、 record で許されるのに何か理由があるのかと思ったけど、
>>567 さんの通り、 SML ではどちらも許されないそうだし、あんまり深い意味はないのかな。
>>568
人(言語仕様)が自由に決めるとして、なんでこんなチグハグに(素人目には)見える仕様に
なってるのかなーという。 record が通るってことは、どっちの仕様でも型安全性は保証されるのだよね?
それぞれの仕様の pros/cons が知りたい。
あと、 option の方は、処理系が option の内容を辿るように頑張って実装すればイケるのか、
型理論的になにか問題があるのかよく分からない。
>> 566
値を作れないわけではなかったりする。
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# let rec loop () = loop ();;
val loop : unit -> 'a = <fun>
# { x = 0; y = { x = 1; y = loop () } };;
いや、作れてはいないんだけど、型は付く。
CPS っぽい感じのプログラムで最後に exit するような場合、こういう型が出現することもある…気がする。
tuple で許されず、 record で許されるのに何か理由があるのかと思ったけど、
>>567 さんの通り、 SML ではどちらも許されないそうだし、あんまり深い意味はないのかな。
>>568
人(言語仕様)が自由に決めるとして、なんでこんなチグハグに(素人目には)見える仕様に
なってるのかなーという。 record が通るってことは、どっちの仕様でも型安全性は保証されるのだよね?
それぞれの仕様の pros/cons が知りたい。
あと、 option の方は、処理系が option の内容を辿るように頑張って実装すればイケるのか、
型理論的になにか問題があるのかよく分からない。
571デフォルトの名無しさん
2012/10/13(土) 10:30:56.43 ああ書いていて気づいた。 record は mutable なフィールドを許すから、
# type t = { x: int; mutable y: t };;
type t = { x : int; mutable y : t; }
# let rec v = { x = 0; y = v };;
こういう循環している値を使うことが普通にあるわけで、 cyclic な型を認めておいた方が便利なのだ。
一方で tuple は常に immutable だから、無限ループになるような通常は起こりにくい状況でしか
cyclic な型が出てこない。
たぶん。
# type t = { x: int; mutable y: t };;
type t = { x : int; mutable y : t; }
# let rec v = { x = 0; y = v };;
こういう循環している値を使うことが普通にあるわけで、 cyclic な型を認めておいた方が便利なのだ。
一方で tuple は常に immutable だから、無限ループになるような通常は起こりにくい状況でしか
cyclic な型が出てこない。
たぶん。
572デフォルトの名無しさん
2012/11/03(土) 17:26:40.17 久々にtuareg-mode使ったけど、インデントが変わったのな。
昔のはletをネストするとだんだん右に行って見づらかった
昔のはletをネストするとだんだん右に行って見づらかった
573デフォルトの名無しさん
2012/11/07(水) 04:55:27.01 Ocaml関数引数の省略説明って簡単に嵌ってしまた
let plus x y = x + y
let incr = plus 1
incr 1
2
let minus x y = x - y
let decr = minus 1
decr 2
-1 ????
let decr = plus -1
error
let decr = plus (-1)
decr 2
1
let decr x = minus x 1
decr 2
1
こんな感じww
途中で
val incr : int -> int = <fun>
こんな説明出てくるけど、何それ?ってw
let plus x y = x + y
let incr = plus 1
incr 1
2
let minus x y = x - y
let decr = minus 1
decr 2
-1 ????
let decr = plus -1
error
let decr = plus (-1)
decr 2
1
let decr x = minus x 1
decr 2
1
こんな感じww
途中で
val incr : int -> int = <fun>
こんな説明出てくるけど、何それ?ってw
574デフォルトの名無しさん
2012/11/07(水) 19:10:06.18 そうですね。
575デフォルトの名無しさん
2012/11/08(木) 20:48:16.69 例えばこの例は間際らしい
let capitalize = function
| 'a' .. 'z' as letter -> Char.uppercase letter
| 'A' .. 'Z' as letter -> letter
| _ -> failwith "Not a valid letter"
これを、こう書き換えても問題ない
let capitalize = function
| 'a' .. 'z' as lett -> Char.uppercase lett
| 'A' .. 'Z' as lette -> lette
| _ -> failwith "Not a valid letter"
何が言いたいかと言うと、初見の場合as letter が何か特別な予約語に思えて混乱する(letterの綴りが省略されていないため)
で、下のように書き換えて動作を確認した
let capitalize = function
| 'a' .. 'z' as letter -> Char.uppercase letter
| 'A' .. 'Z' as letter -> letter
| _ -> failwith "Not a valid letter"
これを、こう書き換えても問題ない
let capitalize = function
| 'a' .. 'z' as lett -> Char.uppercase lett
| 'A' .. 'Z' as lette -> lette
| _ -> failwith "Not a valid letter"
何が言いたいかと言うと、初見の場合as letter が何か特別な予約語に思えて混乱する(letterの綴りが省略されていないため)
で、下のように書き換えて動作を確認した
576デフォルトの名無しさん
2012/11/11(日) 07:45:41.63 これ
let head_head = function
| [] -> failwith "the list is empty"
| []::_ -> failwith "the head is the empty list"
| (h::_)::_ -> h
head_head [[1;2;3];[4;5;6]]
1
とか、listのlistから、頭のlistの頭を取り出す関数なんだけど
head_head []
head_head [[];[1]]
とかはエラーを返すけど
head_head [1;2;3]
とかするとlistの要素がlistじゃないってエラーが出てくる
この場合を検出してエラーを返す書き方が思いつかない
検出する意味も必要もないのかどうかも分からない
let head_head = function
| [] -> failwith "the list is empty"
| []::_ -> failwith "the head is the empty list"
| (h::_)::_ -> h
head_head [[1;2;3];[4;5;6]]
1
とか、listのlistから、頭のlistの頭を取り出す関数なんだけど
head_head []
head_head [[];[1]]
とかはエラーを返すけど
head_head [1;2;3]
とかするとlistの要素がlistじゃないってエラーが出てくる
この場合を検出してエラーを返す書き方が思いつかない
検出する意味も必要もないのかどうかも分からない
577デフォルトの名無しさん
2012/11/11(日) 08:04:45.04 head_headの型を理解してるか?
578デフォルトの名無しさん
2012/11/11(日) 09:47:55.90 はい、たぶん
基本[[];[]]な形式、list のlist構造
でも、なんか色々自由がありそうと感じる分、制約とか制限についての認識が欠落してしまう
制約制限がないと意味不明のバクが爆発するから必須なんだけど
なのに、魂が叫ぶ、もっと自由にやらせろ
間違って[1;2;3]な通常のlistを渡したときなんとか出来そうな思い込みをしてしまう。
[]要素のないlist
[[];[1;]] listの最初のlistが[]なlist
[[];[]] 同上
[1;2;3] 必要な要件を全然満たさないlist構造
基本[[];[]]な形式、list のlist構造
でも、なんか色々自由がありそうと感じる分、制約とか制限についての認識が欠落してしまう
制約制限がないと意味不明のバクが爆発するから必須なんだけど
なのに、魂が叫ぶ、もっと自由にやらせろ
間違って[1;2;3]な通常のlistを渡したときなんとか出来そうな思い込みをしてしまう。
[]要素のないlist
[[];[1;]] listの最初のlistが[]なlist
[[];[]] 同上
[1;2;3] 必要な要件を全然満たさないlist構造
579デフォルトの名無しさん
2012/11/11(日) 14:45:44.54 型が違えば処理系に弾かれてお終い
580デフォルトの名無しさん
2012/11/11(日) 18:10:18.79 考え方が動的型付けに染まってる印象。
581デフォルトの名無しさん
2012/11/12(月) 02:30:05.37582デフォルトの名無しさん
2012/11/17(土) 14:20:04.43 let f = function
| [] -> failwith "empty list"
| [| _; (_, x) |]::_ -> x
| _ -> failwith "the first array should be of size two"
に
f [[|(1,2);(3,4)|];[|(5,6);(7,8)|]];;
でint = 4の結果が得られる
でも、 エラー"the first array should be of size two"が表示される引数が上手く作れない
システムが先にエラーを吐き出す。
| [] -> failwith "empty list"
| [| _; (_, x) |]::_ -> x
| _ -> failwith "the first array should be of size two"
に
f [[|(1,2);(3,4)|];[|(5,6);(7,8)|]];;
でint = 4の結果が得られる
でも、 エラー"the first array should be of size two"が表示される引数が上手く作れない
システムが先にエラーを吐き出す。
583デフォルトの名無しさん
2012/11/17(土) 18:42:30.31 # f [[|(1,2)|];[|(5,6);(7,8)|]];;
Exception: Failure "the first array should be of size two".
いかんのか?
Exception: Failure "the first array should be of size two".
いかんのか?
584デフォルトの名無しさん
2012/11/17(土) 19:34:18.32 >>583
ありがとうございます。
出来ました。
関数fの受け付ける
('a * 'b) array list -> 'b = <fun>
の形式がどの様な表現なのか直感的に理解できなかったので助かりました。
('a * 'b) array list形式の引数が与えられると
2番目の条件にマッチングできなくて、3つ目の条件で"the first ~~ two"が表示されるんですね。
[[|(1,2)|]] の様に表現するとタイプミスマッチとか処理系がエラーを出すと思っていました。
でも、('a * 'b) array list形式なので引数としては間違っていない。
ありがとうございます。
出来ました。
関数fの受け付ける
('a * 'b) array list -> 'b = <fun>
の形式がどの様な表現なのか直感的に理解できなかったので助かりました。
('a * 'b) array list形式の引数が与えられると
2番目の条件にマッチングできなくて、3つ目の条件で"the first ~~ two"が表示されるんですね。
[[|(1,2)|]] の様に表現するとタイプミスマッチとか処理系がエラーを出すと思っていました。
でも、('a * 'b) array list形式なので引数としては間違っていない。
585デフォルトの名無しさん
2012/11/19(月) 03:26:09.19 結局、[1,2]と入力すると[(1,2)]と返ってくるのでlistの要素構造を勘違いしてた(この部分"[(1,2)]"を見落とし)
[1;2]は整数1と2によるlist、これと[(1,2)]の省略した入力[1,2]と混同してた
だから、[1;(2,3)]とか入力してエラー出されて??な感じ。
正しくは、[(1,4);(2,3)]と表現しないといけない。
[1,4;2,3]とタイプしても正しく[(1,4);(2,3)]と返ってくる
こんな初歩的な部分で躓くとは、これではソースが読めないわけだ。
[1;2]は整数1と2によるlist、これと[(1,2)]の省略した入力[1,2]と混同してた
だから、[1;(2,3)]とか入力してエラー出されて??な感じ。
正しくは、[(1,4);(2,3)]と表現しないといけない。
[1,4;2,3]とタイプしても正しく[(1,4);(2,3)]と返ってくる
こんな初歩的な部分で躓くとは、これではソースが読めないわけだ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【高市朗報】 日本政府「一昨年は1300億円。去年も防衛費が1100億円余ったw」 日本の防衛費は充分足りてる事が判明。増やす必要無し [485983549]
- 高市早苗「支持者の理解を得られないので台湾発言を撤回できない」 [931948549]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 【速報】51歳まで自衛隊になれるように法改正ww [347751896]
