【.NET】F#について語 ..
[2ch|▼Menu]
262:デフォルトの名無しさん
08/03/28 18:12:16
VSShellをDLしようと思って、Visual Studio 2008 SDK 1.0をDLしたんだけど
Visual Studioがインストールされてないとだめみたいだ。VSShell単体って
どこにあるの?てか、あるの?

263:デフォルトの名無しさん
08/03/28 18:13:53
あったわ。

264:デフォルトの名無しさん
08/03/28 19:12:55
ハローワールドできたわ。
で、いい本ないの?

265:デフォルトの名無しさん
08/03/28 19:15:17
URLリンク(www.amazon.com)

Foundations of F#

ネイティブが分かりにくいと酷評してるんだが、読んだ人どう?

266:デフォルトの名無しさん
08/03/28 19:40:56
全部読んでないが、Expert F#のほうが分かりやすい。
内容も別にExpert向けというわけでもないし。高度な話題も載ってるが。

267:デフォルトの名無しさん
08/03/28 19:56:18
>>266
そうなんだ。
星の数のとおりか。
でも高いな。。

268:デフォルトの名無しさん
08/04/19 10:36:13
すみません、WinAPI呼び出しわかる方いますか?やりたいこと→PeekMessage呼び出し

[<DllImport("user32.dll", EntryPoint="PeekMessage" ,SetLastError=true,CallingConvention=CallingConvention.StdCall)>]
let PeekMessage( (lpMsg : ref MSG),(hwnd : Int32),(wMsgFilterMin : Int32),(wMsgFilterMax : Int32),(wRemoveMsg : PeekMsgOption)):bool = failwith "extern";;

エラーメッセージ
 The type 'MSG' is not defined.
 The type 'PeekMsgOption' is not defined.

MSG構造体については
自分の環境(Win2k,VS2005,.Net framework 2.0.50727.42)ではwindowsbase.dllがないようなので
これはXPかVistaを使えってことでしょうかね,..
 URLリンク(msdn2.microsoft.com)
また、PeekMsgOptionはオンラインのMSDNではほとんど情報がないようです
そもそも、VS2005のF#プロジェクトでは「参照の追加」はできないのでしょうか?


269:268
08/04/21 00:39:32
↓XPと.net framework3.0入れたらコンパイル通ったので、何かの参考までに。

open System.Runtime.InteropServices;;
open System.Windows.Interop;;
[<System.Flags>]
type PeekMsgOption =
| PM_NOREMOVE = 0
| PM_REMOVE = 1;;
[<DllImport("user32.dll", EntryPoint="PeekMessage" ,SetLastError=true,CallingConvention=CallingConvention.StdCall)>]
let PeekMessage( (lpMsg : (ref <System.Windows.Interop.MSG>)),(hwnd : Int32),(wMsgFilterMin : Int32),(wMsgFilterMax : Int32),(wRemoveMsg : PeekMsgOption)):bool = failwith "extern";;


270:デフォルトの名無しさん
08/04/21 18:42:16
そりゃそうだ。
System.Windows以下(Forms除く)は.NET Framework 3.0からのWPF。

そこのURLの先にもはっきりとこうかいてあるはずだ。
バージョン情報
.NET Framework
サポート対象 : 3.5、3.0 SP1、3.0

System.Windows.Forms.Messageなら2.0でも使える。

PeekMsgOptionについてさっぱり見つからないのは、
単にその2つの定数を宣言するためだけに即興で作ったからではないか?
もともとはただの符号無整数型だし。
URLリンク(msdn2.microsoft.com)(VS.85).aspx


271:デフォルトの名無しさん
08/04/22 01:51:43
MSGとかの構造体を自力で実装しなくていいってことか?
まじ.netとかそうなってるの?
そもそも実行できたのかあやしいんだが

272:デフォルトの名無しさん
08/04/24 19:14:11
さらに追記
(lpMsg : (ref <System.Windows.Interop.MSG>)の箇所は
(lpMsg :System.Windows.Interop.MSG)にしないと実行時にマーシャリング系のエラーが出る。
しかしどちらにせよ、デバッグモードで動かすと構造体のサイズ違うっていわれるから
自分でMSG構造体定義した。


..けれど結局、やりたかったことは、Win32API使わなくてもできたよotz

273:デフォルトの名無しさん
08/05/02 08:32:37
1.9.4.15 リリース

274:デフォルトの名無しさん
08/05/03 23:26:43
>>171
OCaml, Haskell, Lispなどの関数型言語はラムダ計算という理論が骨組みにあって、
特別な構文を使わずに、柔軟なプログラミングをすることができる。
関数を抽象化するためのdelegateや、多相型を表現するためのgenericsなども、
特別な構文無しにプログラムできる。

しかも、キャストや、nullを使う言語よりも、実行時の安全性が高い。

関数型言語を知っている学生は、プログラミングの質に対する意識が非常に高いのが多い。
OCamlができる優秀な学生を雇って、F#のプロジェクトをやれば、いいんじゃね。

275:デフォルトの名無しさん
08/05/04 17:14:41
FizzBuzz 2.0 ですね。わかります。

276:デフォルトの名無しさん
08/05/04 17:35:07
>>274
学生 プッ

277:デフォルトの名無しさん
08/05/05 01:32:22
こんにちは。
F#の開発環境って何があるんでしょうか?
・VS.NET拡張
・エディタとコンパイラ
以外にはありませんか?

278:デフォルトの名無しさん
08/05/05 07:15:19
つ インタプリタ(fsi.exe)

279:デフォルトの名無しさん
08/05/05 07:43:21
Expert F#のPDFを買ったお

Expertというわりにぜんぜん入門から対応しているから、いいね。
しかし、600ページ以上あって読み応えありすぎだw

280:デフォルトの名無しさん
08/05/05 07:44:25
>>278
good! 補間や履歴も聞いていいですな。

しかしC-Aで行頭、C-Eで行末移動がほしかったな

281:デフォルトの名無しさん
08/05/05 08:06:22
ebook版ってあったのか。英語はわかりやすくてよいよね
ただ、分厚いから俺は辞書的に使ってる

>>280
つ fsi用のEmacsモード作ろうぜってスレッド。俺は試したことないけども参考までに
URLリンク(cs.hubfs.net)


282:デフォルトの名無しさん
08/05/05 14:23:56
>>277
URLリンク(www.infoq.com)

283:デフォルトの名無しさん
08/05/11 03:09:37
F#のライセンスについて、市販製品に使うときの注意事項を3行でplz

284:デフォルトの名無しさん
08/05/11 09:07:12




285:デフォルトの名無しさん
08/05/11 18:42:58
fslexってまだ日本語対応してないのな・・
URLリンク(www.strangelights.com)

 { open Microsoft.FSharp.Text.Printf;; }
 rule strtest = parse
  | _ { printf "%c" (Lexing.lexeme_char lexbuf 0); strtest lexbuf }
  | eof { raise End_of_file }
 {
  //こっから実行コード
  let test s = strtest (Lexing.from_string s);;
  try test "aiueo" with _ -> printf "\n--end--\n";;
  try test "あいうえお" with _ -> printf "\n--end--\n";;
  printf "あいうえお";;
 }
実行結果
 aiueo
 --end--
 ?????
 --end--
 あいうえお


286:デフォルトの名無しさん
08/05/17 07:30:42
ふとおもったんだがLispの.NETなやつってある?

287:デフォルトの名無しさん
08/05/17 09:49:01
>>286
List of CLI Languages - Wikipedia, the free encyclopedia
URLリンク(en.wikipedia.org)

IronLisp, L#, DotLisp

NemerleもLispを参考にしてるらしいな

288:デフォルトの名無しさん
08/05/17 10:33:20
英語のwikiは凄いな
P#とかA#とかあるw

289:デフォルトの名無しさん
08/05/17 11:03:43
これみてP#やってみたくなったw

290:デフォルトの名無しさん
08/05/17 11:54:21
ううむ,原理的には JVM でもいろいろできるんだろうけど,
MSIL (っていうのか?)上での方がバリエーションが多いなぁ.
これって一応MS的にはドッキリ大成功みたいな感じなのかね?


291:デフォルトの名無しさん
08/05/17 13:37:21
>>290
MSは.NET 1.0のSDKにLISPのコンパイラを付けてたくらいだから
最初から狙って取りに行ってたんだと思うよ。

292:デフォルトの名無しさん
08/05/17 20:56:32
MSはCOMでも多言語に凝っていたな。

293:デフォルトの名無しさん
08/05/17 22:29:12
>>245
そもそもこの例ではfold_leftを使って、
let sum = fold_left (+) 0
のようにできるのでは。(やぼですかそうですか)

末尾再帰のスタイルとしてはsum2の方がよい気がします。
>もともと引数は「入力、出力」の順で書いてたので。
関数型言語では、部分適用などができるから、この考え方はやめた方が。

294:デフォルトの名無しさん
08/05/24 02:19:35
列挙型の扱いってよくわからないんですが誰か助けてください
今Visioのオートメーションのプログラム作ってて、以下の定数と
URLリンク(msdn.microsoft.com)
以下のオブジェクトのTypeの値を比較する文が書きたいが
URLリンク(msdn.microsoft.com)
型があわないと文句言われます

今の俺の認識
deprecated1:Idiomを使う
deprecated2:Enum.combineを使う
今後:|||や&&&などのBitwise andやorを使う。最新版にコンパイラ変えたら、これつかえと警告でた

以下思いつく限り試してみたもの。全滅
if (obj.Type = Visio.VisShapeTypes.visTypeGuide) then ...
if ((obj.Type &&& Visio.VisShapeTypes.visTypeGuide) <> 0) then ...
if (obj.Type = (Visio.VisShapeTypes.visTypeGuide : int16)) then ...
if (obj.Type = (Visio.VisShapeTypes.visTypeGuide :> int16)) then ...
if (obj.Type = (Visio.VisShapeTypes.visTypeGuide :?> int16)) then ...
if ((obj.Type:>int) = (Visio.VisShapeTypes.visTypeGuide :> int)) then ...
msg (Microsoft.FSharp.Compatibility.OCaml.Obj.magic (s.Type.ToString())); (* これは数値5 *)
msg (Microsoft.FSharp.Compatibility.OCaml.Obj.magic (Visio.VisShapeTypes.visTypeGuide.ToString())); (* これは文字列が出る *)
(obj.magic ごにゃごにゃ).ToString()はエラーになります

295:デフォルトの名無しさん
08/06/05 08:25:16
OCamler な俺には 294 ってキモすぎてしょうがないんだが。
F# プログラムってこうなの?


296:デフォルトの名無しさん
08/06/05 09:33:50
パターンマッチングつかえってことかい?


297:デフォルトの名無しさん
08/06/05 10:31:35
いや、Obj.magic とか、キモい


298:デフォルトの名無しさん
08/06/07 13:13:10
名前空間深すぎて読み辛すぎるな

299:デフォルトの名無しさん
08/06/08 01:17:34
Ocamlerってなんて読むの?おかむらー?


300:デフォルトの名無しさん
08/06/08 08:25:13
MinCamler?
SML#ist?

301:デフォルトの名無しさん
08/06/08 10:44:49
>>299
オブジェクティブラクダ

302:デフォルトの名無しさん
08/06/08 14:26:15
OCaml 使いは 岡村 なのか・・・

303:デフォルトの名無しさん
08/06/15 17:59:55
だからOでオブジェクティブなんだよw

Camlはフランス語でラクダ(キャメル)の意。

オブジェクティブキャメラー。

304:デフォルトの名無しさん
08/06/15 20:17:58
ラクダー

305:デフォルトの名無しさん
08/06/16 05:50:15
>Camlはフランス語でラクダ(キャメル)の意。
大嘘こいてんじゃねーよ


306:デフォルトの名無しさん
08/06/16 08:30:41
C: Categorical
A: Abstract
M: Machine
L: Language

307:デフォルトの名無しさん
08/06/16 14:44:39
>>305
低脳w

308:デフォルトの名無しさん
08/06/16 20:21:27
camlなんてフランス語ないよね
仮に camelのつもりだとしてもない


309:デフォルトの名無しさん
08/06/16 21:41:05
>>308
camlはフランス語にあるよw

310:デフォルトの名無しさん
08/06/16 22:35:11
つまらん


311:デフォルトの名無しさん
08/06/16 23:53:02
>>309
ない

312:デフォルトの名無しさん
08/06/17 01:28:22
>>311
学習用の辞書に載ってないからってw

313:デフォルトの名無しさん
08/06/17 01:46:38
CAML = Cargo Aircraft Minelayer

314:デフォルトの名無しさん
08/06/17 02:13:44
そいうや随分前にも全角wで書き込む阿呆がいたな
日本もそういう季節になったの?



315:デフォルトの名無しさん
08/06/17 05:12:02
フォントをメイリオにしてから全角、半角の区別がつかない

316:デフォルトの名無しさん
08/06/17 17:48:41
それだけMSゴシックが不メイリオだったってことか。

317:デフォルトの名無しさん
08/06/27 09:50:45
これってバグかな?マニュアルでは見つからない場合Not_found例外とあるが
IndexOutOfBounds例外が出る
初心者なので判断がつかず・・

let msg s = System.Windows.Forms.MessageBox.Show s |> ignore in
try
let h = List.find ((<)100) [1..10] in
printf "%A\r\n" h
with e -> msg (e.ToString());;


318:デフォルトの名無しさん
08/06/27 23:13:30
F#のことは知らんOCamlの人だけど、printfでこけてんじゃないの?


319:デフォルトの名無しさん
08/06/28 07:12:14
んー、以下のコードでも試してみたけど、やはりIndexOutOfBounds例外でます
ライブラリよりは俺のコードがバグってると思うんで
どっかしょぼい所でミスってるんじゃないかと思うが・・
let msg s = System.Windows.Forms.MessageBox.Show s |> ignore in
try
List.find ((<)100) [1..10] |> ignore
with e -> msg (e.ToString());;


320:デフォルトの名無しさん
08/06/28 07:56:45
手元のF# Version 1.9.4.17だと、>>317
Not_found(System.Collections.Generic.KeyNotFoundException)例外が出るので
コードに問題はないはず

この例外は、.NET Framework version 2.0で追加されたものなので、
Microsoft .NET Framework Version 2.0 Redistributable Package
を入れれば直るんじゃない?

321:デフォルトの名無しさん
08/06/28 11:18:47
検証ありがとうございます。
私の環境の問題のようですね

F#のバージョンも1.9.3.14と少し古いので
あわせてバージョンアップしてみますわ

322:デフォルトの名無しさん
08/06/29 01:37:08
ちょwwまずはバージョン確認せいやw

323:デフォルトの名無しさん
08/07/01 21:03:36
>>317
Detailed Release Notes for F# 1.9.4
URLリンク(blogs.msdn.com)

> Not_found now maps to KeyNotFoundException not IndexOutOfRangeException.

324:デフォルトの名無しさん
08/07/08 20:09:07
F#はLinux上でも動きますか?
コンパイルだけでもしたいのですが。。。

325:デフォルトの名無しさん
08/07/08 20:38:01
>>324
zipを展開すると install-mono.sh が入っているからこれで動くんじゃないのかね。


326:デフォルトの名無しさん
08/07/10 01:28:11
InfoQ: F#の土台を越えて - 非同期ワークフロー
URLリンク(www.infoq.com)

327:デフォルトの名無しさん
08/07/15 12:14:54
URLリンク(blogs.msdn.com)
1.9.4.19 release

328:デフォルトの名無しさん
08/08/30 07:27:00
Microsoft F#, September 2008 Community Technology Preview
URLリンク(www.microsoft.com)

言語仕様からライブラリ構成まで、だいぶ変わったな

329:デフォルトの名無しさん
08/08/30 11:05:27
非同期ワークフローとか、ParallelExtention,Scopeとかがどうかぶってどう統合されるのかがよくわからん(´・ω・`)

330:デフォルトの名無しさん
08/08/30 12:49:52
知ってる言葉を並べてるだけだろ

331:デフォルトの名無しさん
08/08/30 14:29:36
>>330
ぷっ
理解できないからって・・・w

332:デフォルトの名無しさん
08/08/30 18:29:51
>>330
ぷっ
理解できないからって・・・w

333:デフォルトの名無しさん
08/08/30 21:27:29
>>330
理解できないからぶってぶって・・・w


334:デフォルトの名無しさん
08/08/31 18:01:34
>>333
は?

335:デフォルトの名無しさん
08/08/31 18:06:01
>>333
は?

336:デフォルトの名無しさん
08/08/31 18:14:01
>>333
は?

337:デフォルトの名無しさん
08/09/01 00:19:39
俺もぶってほしい(*´∀`*)

338:デフォルトの名無しさん
08/09/07 01:30:34
Detailed Release Notes for the F# September 2008 CTP release
URLリンク(blogs.msdn.com)

Microsoft F#, September 2008 Community Technology Preview
URLリンク(www.microsoft.com)
F# 1.9.6.2

339:デフォルトの名無しさん
08/09/08 13:19:45
ブログネタとかでもだんだん見るようになってきたけど、
OCaml派生として使ってるやつばっかりだな
OCaml知らない俺から見るとなんかぜんぜんF#っぽくないし、
そっち系は面白くならないと思うが。
.NETライブラリ使ってるやつとかあんまいないのかね

340:デフォルトの名無しさん
08/09/08 20:26:38
>>339
windows上の設置が簡単なocamlって扱いだからでないか?
人に渡すにしてもランタイムいらんし。

341:デフォルトの名無しさん
08/09/11 11:17:55
CTPになって2008しかインストール出来なくなったのはいいけど、
前からあったサンプルプログラムがコンパイルできないよ。

CTP用のサンプルはDirectX関係がコンパイル出来ないし、
スレッド周りとか勉強したいんだけどなぁ。


342:デフォルトの名無しさん
08/09/19 15:40:17
.netライブラリなんて他と同じように使えばいいだろ

343:デフォルトの名無しさん
08/09/22 23:34:56
こうですか?わかりません
をVB.NET風に書こうと思ったけどめんどくさかったのでやめた



344:デフォルトの名無しさん
08/09/24 21:44:32
#useってデバッグ用途とかでかなり便利だったのにな。
#loadじゃ関数とかアクセスできないし、
再起動してfsi --useも起動の時間がかかりすぎて代わりにならない。
復活してくれんかな。

345:デフォルトの名無しさん
08/10/12 13:14:30
.Net使ってるとWin32APIが使いたい場面が多々出てくるが
細かいところでわからんことが多い
C#⇔F#コード対応表みたいなのがほしいわ
フック書きてぇ


346:デフォルトの名無しさん
08/10/13 09:33:20
F#で学ぶ関数型プログラミング入門
「関数型プログラミングの主な概念とF#での利用例」

URLリンク(codezine.jp)

347:デフォルトの名無しさん
08/10/13 15:13:21
>>345
P/Invoke宣言だけはC#で書いてしまえばいいんでない?

348:デフォルトの名無しさん
08/10/13 16:01:48
↓こんなのがC#側で定義出来るってこと?
[<DllImport("user32.dll",EntryPoint="SetWindowsHookEx",SetLastError=true)>] let ...

(たぶんdelegateキーワード使う)HOOKPROCの型がわからないので
実際そこでも詰まってるんだが、それがわかったとしても
SetHookの返り値をIntPtr.Zeroとどうやって比較するのかとか
わからない箇所あって、若干諦めてる

ところでF#にはいわゆるbreakやcontinueはないんですかね
for文の中でreturnするケースは手続き型の既存資産には多いと思うが
F#に移植しようと思ったら再帰等でロジックを考え直す必要があるとすると
作業コストが高い
break,last,return,continueなんかで言語仕様検索しても
それらしいのは見つからんね

349:デフォルトの名無しさん
08/10/13 16:12:45
自己レス。残念だけどなさそうだわ
URLリンク(cs.hubfs.net)

350:デフォルトの名無しさん
08/10/13 19:17:02
>>348
移植コストを下げることに意味はない
カエレ

351:デフォルトの名無しさん
08/10/13 19:27:22
アローつくれば、順次処理、条件分岐、繰り返しができるお

352:デフォルトの名無しさん
08/10/13 19:43:07
>>350 なぜ

353:デフォルトの名無しさん
08/10/14 09:33:33
逆に、何でソースコードレベルで移植しようとか思うんだ?
対象環境に言語処理系が無いとかなら分かるけど、.NETだぞ?
普通、DLL作ってFFI経由で呼び出しするだろ。

なんだか、同じ言語で書くことにこだわりすぎてる気がするけど。

354:デフォルトの名無しさん
08/10/14 22:37:30
>>345 そんな単純な置き換えができるのはVB⇔C#とかだけだろ
F#は関数型言語で全然違うから、考えを変える必要があるかもしれない

むしろC#とF#のコードの一対一対応表がつくれるくらい似てる言語なら、F#いらねーだろ。

355:デフォルトの名無しさん
08/10/14 22:44:09
そんなたいそうな理由があるわけじゃなくて、
単に楽したいと思ったんだが、気に障ったならすまない

356:デフォルトの名無しさん
08/10/15 09:36:44
>>355
関数型言語によるプログラミングスタイルの一種に
breakやcontinueを使わずに制御構造をくっつけていくという一派がある。
それを調べてみると面白いと思うよ。

listモナドとかmaybeモナドとか>>351の言ってるarrowとか。
URLリンク(d.hatena.ne.jp)

慣れるとむしろbreakやcontinueイラネになる。

357:デフォルトの名無しさん
08/10/15 14:47:07
もしかして、今の新しいバージョンのF#って2008製品版もってないと
入れられなくないですか・・・?('A`)

>>356
ほー、参考になる

358:デフォルトの名無しさん
08/10/15 17:36:17
前のバージョンなら Express でも入れられたの?
プラグインとか機能追加系は製品版じゃなきゃ基本無理。


359:デフォルトの名無しさん
08/10/15 22:56:25
よく調べもせず臆面なくそんなレスを…

360:デフォルトの名無しさん
08/10/16 20:30:58
そのための2ch

361:デフォルトの名無しさん
08/10/16 22:05:54
356見て、出来たらF#でarrowを表現してみたいと思ったがさっぱりだ
関数a->bを渡すとarr a bが出来て、
arr a bの型に対する操作が色々あるんだろうと思うんだが
arr a bの型に当たる物はf#ではどう表現すれば良いのか
'a 'b tみたいに複数のジェネリックな型を持つことになる?

もしかしてHaskellのほうが抽象度が高いことができる?

362:デフォルトの名無しさん
08/10/16 22:07:12
>>358
2008はもってないんだよね・・・うpでとするいい機会だ

363:デフォルトの名無しさん
08/10/17 07:35:28
>>361
higher kind genericsというやつで、F#の型システムでは再現は無理ぽ。(´・ω・`)
F#もどきで書くと、こんな感じのものが必要。

Arrow<'arr<'a, 'b>>

364:デフォルトの名無しさん
08/10/17 19:13:35
なるほど、非常に参考になった。
Haskellは進んでるな

365:デフォルトの名無しさん
08/10/18 10:44:02
>>357, >>358, >>362
Visual Studio 2008 Shell (integrated mode) Service Pack 1
URLリンク(www.microsoft.com)

366:デフォルトの名無しさん
08/10/18 16:24:25
>>365
Thanx。shell runtime入れりゃよかったのね

367:デフォルトの名無しさん
08/11/01 12:44:35
手続き型べったりの人間には (|>) を多用すると評価順序がわからなくなって混乱するんだぜ

>>123とか

let _ = List.iter ((|>) ()) (List.map ((delay >> flip) (printf "closure %d\n" )) [1..10])

とかけば (unit -> unit) unit が10回ってわかるんだが…

368:デフォルトの名無しさん
08/11/03 11:54:03
これでいいんじゃね?
Seq.iter (fun n -> printf "closure %d\n" n) [1..10]

369:デフォルトの名無しさん
08/11/08 22:41:18
素人です。Expert F#読んでてわからないことがあったので質問

type Attempt<'a> = unit -> 'a option
let runAttempt (a:Attempt<'a>) = () |> a

type AttemptBuilder() =
  member b.Return(x) = fun () -> Some x
  member b.Bind(p, rest) = match runAttempt p with None -> (fun () -> None) | Some x -> rest x
  member b.Let(p, rest) = rest p

let attempt = new AttemptBuilder()
let failIfBig n = attempt { if n>1000 then return! (fun () -> None) else return n }

とあったとき、これ↓を de-sugar しろって問題なんだけど、
let sumIfBothSmall (i1, i2) =
  attempt { let sum = ref 0
   let! n1 = failIfBig i1
   do sum := sum.Value+n1
   let! n2 = failIfBig i2
   do sum := sum.Value+n2
   return sum.Value }

これ↓であってるかな?
let sumIfBothSmall2 (i1, i2) =
   attempt.Let(ref 0, (fun sum ->
    attempt.Bind(failIfBig i1, (fun n1 ->
     attempt.Bind(attempt.Return(sum := sum.Value+n1), (fun () ->
      attempt.Bind(failIfBig i2, (fun n2 ->
       attempt.Bind(attempt.Return(sum := sum.Value+n2), (fun () ->
        attempt.Return sum.Value))))))))))

見づらくて申し訳ない…

370:デフォルトの名無しさん
08/11/10 23:15:20
こうじゃない?
let sumIfBothSmall2 (i1, i2) =
  attempt.Let(ref 0, (fun sum ->
   attempt.Bind(failIfBig i1, (fun n1 ->
    attempt.Let(sum := sum.Value+n1, (fun () ->
     attempt.Bind(failIfBig i2, (fun n2 ->
      attempt.Let(sum := sum.Value+n2, (fun () ->
       attempt.Return(sum.Value)))))))))))

ここ見る限り
URLリンク(blogs.msdn.com)

371:369
08/11/15 21:52:50
あーunit -> 'a option のコンテナってことか
ようやく理解できたような
ありがとう

372:デフォルトの名無しさん
08/11/23 10:37:08
C++のvectorみたいなコンテナってある?
Microsoft.FSharp.Collections.ResizeArrayがそうかと思ったら、
Note: an abbreviation for List<'a>て書いてあたよ

373:デフォルトの名無しさん
08/11/23 12:58:16
ResizeArray でいいんじゃないのん?
Microsoft.FSharp.Collections.List<'a> と System.Collections.Generic.List<'a> は別物

URLリンク(research.microsoft.com)

374:デフォルトの名無しさん
08/11/27 09:16:40
ああ、Listって名前だから勘違いしたけどインデックスアクセスはO(1)なんだな


375:デフォルトの名無しさん
08/11/29 21:53:44
System.Windows.Forms.dllを参照したいんですが、.NETのVersion3.5には見つかりませんでした。
フォームを表示するアプリケーションを作る場合、現状では.NET Version2のSystem.Windows.Forms.dll
を参照するしかないんでしょうか?

376:375
08/11/29 22:24:55
自己解決しました。

アセンブリ System.Windows.Forms
.NET Framework 3.5, .NET Framework 3.0, .NET Framework 2.0 のメンバ
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll

と書いてあったので、今の設定で良さそうです。

377:デフォルトの名無しさん
08/12/05 18:55:21
今、日本がピンチです。
URLリンク(messages.yahoo.co.jp)
URLリンク(sora1975.blog88.fc2.com)
リンク先を見て危機を感じるなら、コピペを貼ってください。



378:デフォルトの名無しさん
08/12/11 20:42:09
Foundation of F#の92ページのサンプルってビルド失敗しないか?
IEnumerable.iterで怒られる。iterなんてねーよって。

379:デフォルトの名無しさん
08/12/11 20:46:53
Seqにしたら動いた。。

380:デフォルトの名無しさん
08/12/12 19:54:50
F#の時代がクル━━━(゚∀゚)━━━ !!

正式発表:Visual Studio 2010がF#でシップ予定 - InfoQ
URLリンク(www.infoq.com)

381:デフォルトの名無しさん
08/12/12 20:01:17
WindowsではC++は消え行く運命か?

382:デフォルトの名無しさん
08/12/12 20:23:12
何でそう思ったのか知らんけど、当面は残るから心配する必要は無い。
まぁでも、Windows向けに開発するなら.NETにも触れといた方がいいとは思う。

383:デフォルトの名無しさん
08/12/12 21:48:11
>>380
機能プログラミングって・・・w

384:デフォルトの名無しさん
08/12/12 22:14:33
F#はOCamlのコード書くために使うわ

385:デフォルトの名無しさん
08/12/13 10:57:24
>J#と全く同様の方法で、
ざわ… ざわ…

386:デフォルトの名無しさん
08/12/27 00:41:54
>>384
let 〜 andができないのこまらね?

387:デフォルトの名無しさん
08/12/27 06:37:35
今後MFC使う場面ってあるの?

388:デフォルトの名無しさん
08/12/27 12:34:30
質問です。
ExpertF#に以下のクラス定義があります。

type Vector2D(dx: float, dy: float) =
let len = sqrt(dx * dx + dy * dy)
member v.DX = dx
member v.DY = dy
member v.Length = len
member v.Scale(k) = Vector2D(k*dx, k*dy)
member v.ShiftX(x) = Vector2D(dx=x+dx, dy=dy) (* @ *)
member v.ShiftY(y) = Vector2D(dx=dx, dy=y+dy) (* A *)

@とAのところで引数を指定するのにdx=x+dxのようにしてい
ますが普通にx+dxではいけないのでしょうか?こちらでも
同じように動作しました。dx=x+dxの方法には他に意味が
あるのでしょうか?

389:デフォルトの名無しさん
08/12/27 13:28:37
名前指定してるから引数の順番入れ替えても許されるとかそういう利便性の話では

390:デフォルトの名無しさん
08/12/27 14:29:25
>>389
レスどうもです。
やってみました。確かにそういう利便性がありました。
ありがとうございました。

391:デフォルトの名無しさん
08/12/27 18:52:50
>>380
VSでは単独での使用が想定されてないとか
アプリケーションのコアを構築するためとか
どういう意味なのかね。想定場面がよくわからん
だいたいC#VBからF#の関数呼ぶのも一苦労なんだけど。
VSなしじゃ使い物にならなくなるってことかな
CLR上のLL的ポジションでいて欲しかったんだけどなあ


392:デフォルトの名無しさん
08/12/28 22:58:56
>>391
F# にはデザイナ ツールが含まれない。
つまり、WinForm やら ASP.NET Page やらをポトペタで開発できない。
ついでにいえば型付きデータ セットも、やるならコードごりごり書くしかない。
やるならやればいいけど。やりたい?それ?やりたくないよね?
じゃそういう部分は C#/VB.NET に任せて、他のコアな部分を F# で書くといいよ。
の意。

>>386
ふつうに書けるけど。なんか別の意味か?

let rec even n =
    if n = 0 then true else odd (n - 1)
and odd n =
    if n = 0 then false else even (n - 1)

393:デフォルトの名無しさん
08/12/29 07:09:17
>>392
ペタペタできないのか
じゃあ覚える意味あんまりないか

394:392
08/12/29 21:39:23
あー。
念のため言っとくと「F# にはデザイナ ツールが含まれない」てのは VS2010 での話ね。
その次の VS とか、あるいは SP とかで、いずれは提供されるようになるものと思われ。
まあ、だとしても何年後だよって話だが。

395:デフォルトの名無しさん
08/12/29 21:48:45
その次の VS とか、あるいは SP とかで、F#がなくなる可能性・・・

396:デフォルトの名無しさん
08/12/30 00:05:38
.net自体物凄い歴史浅いのに、普遍化しとるねぇ

397:デフォルトの名無しさん
08/12/30 01:21:32
>>393
ごめんこれ釣りなのかどうかわからなくなってきたw

398:デフォルトの名無しさん
08/12/30 01:39:42
F#って型推論のせいでVSのインテリセンスの恩恵とかほとんどなさそうだな

399:デフォルトの名無しさん
08/12/30 01:40:25
>>392
ごめんこれ釣りなのかどうかわからなくなってきたw

400:デフォルトの名無しさん
08/12/30 02:53:51
>>392
普通にかけないんだけどなにが普通なんだ?
let x = 2 and y = 1;;

どういう仕様なんだと思ったけどandの前に改行がいるんだな

401:デフォルトの名無しさん
09/01/04 21:03:52
天才ども教えてくれ

let f a b c =
match a, b, c with
| Some a, Some b, Some c -> Some (a, b, c)
| _ -> None

と定義して、以下を実行すると value restriction と言われて結果が None に
ならない。

f (Some 3) None (Some 1.5)

分かる人いる?

そもそもvalue restrictionとは何なのか。

402:デフォルトの名無しさん
09/01/05 22:53:07
>>401
天才じゃないが答えてみる

関数 f の型は
    val f : 'a option -> 'b option -> 'c option -> ('a * 'b * 'c) option
になるわけだけど
    f (Some 3) None (Some 1.5)
という式を評価しても 'b の型は最後まで確定しないわな
それはよろしくない(→というのが超大雑把な value restriction の説明)
つまり 'b の型を明らかにすれば error を消せる
簡単には適当な型注釈をつけてやれば OK で
    f (Some 3) (None : int) (Some 1.5)
とか、あるいは
    (f (Some 3) None (Some 1.5) : (int * int * float) option)
とかすればよい
しかし通常は文脈から 'b が具体的な型に決まることが多い
    if true then f (Some 3) None (Some 1.5) else f None (Some 1) None
だもんで型注釈に頼るような場面は少ないように思われる

403:デフォルトの名無しさん
09/01/06 03:16:50
>>402
なるほど。理解できた。
(None : int)は(None : int option)の誤記だと
思うけど後者でうまくいった。全体に型注釈
をつけても良いんだね。thx。

404:デフォルトの名無しさん
09/01/17 14:45:28
age

405:デフォルトの名無しさん
09/01/23 17:21:26
もうだめぽ

406:デフォルトの名無しさん
09/01/31 17:52:20
とりあえず、Ocamlの開発環境について教えてください。
ライブラリの管理などを含めてノウハウを教えてください。
エディタはこれを使えとか、コンパイルするときはこうしろとか、成果物を配布するときはこうしろとか、
そういう諸々のプログラミング周辺の雑務について知りたいです。

407:デフォルトの名無しさん
09/01/31 22:54:46
関数型が難しいとかわからんとか言ってるヤツってなんなの?
けっこう他の言語はバリバリ使いこなしてるヤツに限ってそういうこと言う
なんかコードも書いてないのにわかんね言ってるように見えるんだけど

Web でかるーく拾いあさった断片的な知識並べてわかんない言われてもねえ

ほなたとえば OOP べんきょーするときもそんなやり方でやったんかと
『やさしい Java』読んだだけで Java できますゆー人間信用すんのかと
実践皆無の人間が OOP 知ってますゆーのを見てなんとも思わんのかと

もうね、自分の知らん新しいテクノロジ排除したいだけのオッサンちゃうんかと

プログラマ名乗るんならまずやってみろよと
知りたいのなら知る努力をしてみせろよと
その上でどこがどーゆー風にわからんのか言えと

408:デフォルトの名無しさん
09/01/31 22:57:09
難易度はともかく関数型は実用性が低いから困るんだよ

409:デフォルトの名無しさん
09/01/31 22:57:51
F# イラネ C# でイイじゃんゆうヤツには
精々逃げ切れるようにがんばれよと言っておきたい

410:デフォルトの名無しさん
09/01/31 23:08:58
>>408
言いたいことはわからないでもない
でも F# に限っていうなら使い分ければいいんでないの?
関数型と命令型と OOP と

411:デフォルトの名無しさん
09/02/01 13:50:33
アルゴリズムらしいアルゴリズムを自分で考えて(選択して)実装することなく、
APIを順に呼んでエラーチェックだけするようなプログラムばっか
書いている(書かされている)人には、勉強しようというモチベーションなど
湧かんだろうなー。

412:デフォルトの名無しさん
09/02/01 22:26:24
やぁ、関数型言語っぽいノリになってきましたね

413:デフォルトの名無しさん
09/02/01 23:08:23
>>411
職業プログラマの多くがそれに該当するのではないかと想像するが
それが仕事なんだから許してやってくれ
職業プログラマの世界では、そもそも「車輪の再生産」は悪とされている
自分でコードを書かなければ工数が減るしバグをつくりこむ機会もなくなるからな

414:デフォルトの名無しさん
09/02/01 23:09:59
うちのところはよく使うものも全然共通化してくれないんだけど・・・

415:デフォルトの名無しさん
09/02/01 23:28:05
世の中の「プログラマ」と名乗る人の結構な割合は関数型言語はおろか、
自力でtreeのトラバース程度もやる必要に迫られたことも無く、
2分探査のコードを書けと言われてバグ無く書けないこと位、みんな判ってるさ。
そして、F#を勉強する俺出世確実、とか思ってるやつもきっといない。

416:デフォルトの名無しさん
09/02/02 00:08:16
自分でアルゴリズムを考えるのが楽しいんだよ。それはもちろん。
でも他人がもう作っちゃったプログラムを同じように作ったってしょうがないだろ。
その労力を新しいものを作る事に傾けたほうが効率的だし、
自分が作るということは作ったものに責任を取るということなんだから、
そんな余計な事まで首突っ込んで余計な責任を取ることも無いだろ。

417:デフォルトの名無しさん
09/02/02 00:27:17
コレクションになんか突っ込んダリするだけですめばいいが、そこに永続化とか色んなフィーチャーを盛り込もうとすれば何処かの段階で全てを自分で作った方がきれいにまとまる段階が来ると思うがどうよ。

もちろん既存のオープンソースなどを使った方がいいのもわかるが、その仕様を自分の要望に合わせる時に無理があることも多いから。

自分で作るのも追っついてるうちはいいが本当に全てを作るわけにもいかずどこまで突き詰め、どこで妥協するのか考える毎日だが。

418:デフォルトの名無しさん
09/02/02 22:11:53
そうなんだよなー
出来合いの API とかじゃ "想定された使い方" しかできん罠
なんかインジェクションしたいってなったらもう自分で組むっきゃないわけで

そんなときにクラスじゃ粒度がデカすぎるって場合も多いんだよね
はばからずに高階のノリでイケるってホント楽(柔軟)でいい

419:デフォルトの名無しさん
09/02/03 00:09:39
>>413
> 職業プログラマの世界では、そもそも「車輪の再生産」は悪とされている
むしろどんどん再生産して儲けてくださいそれが職業プログラマの本分です

420:デフォルトの名無しさん
09/02/03 01:16:29
再生産で儲けるのは三流
俺 一流だから そんなこと しない

421:デフォルトの名無しさん
09/02/03 03:02:26
>>420
「再生産」で儲けることのなにが三流なのか、答えてもらおうじゃないかw

422:デフォルトの名無しさん
09/02/03 12:02:30
儲けて旨い飯が食えりゃどっちでもいいじゃないか。

423:デフォルトの名無しさん
09/02/03 12:13:33
一流は金に困ってなんかいないから、儲けることなんか二の次に考えて新しいことを追い続けられる。

424:デフォルトの名無しさん
09/02/03 12:34:51
何で一流の奴がこんなとこで一流だの三流だのしょうもない議論やってんだよw
俺にできないような、新しい事を追い続けてくれよww

続きはマ板で

425:デフォルトの名無しさん
09/02/03 21:09:42
>>419は皮肉

×車輪の再生産
○車輪の再発明

426:デフォルトの名無しさん
09/02/07 11:05:47
糞スレ

427:デフォルトの名無しさん
09/02/07 23:47:23
関数を表す型を定義して、定数関数を定義しようとしたのですが
型からは関数とわかっていても、関数のようには呼び出せませんでした。

以下のようなことを実現するのは難しいのでしょうか?

type FUNC<'arg1,'result> = F of ('arg1 -> 'result);;
F ((+)1);; //使用例1
F (+);; //使用例2
//ここでエラー
let apply1 (f:FUNC<int,int>) = f 1;;

//apply1 ((+)1)、などとしたい

欲を言えば、FUNC型からarg1やresultの型を取り出すような
プログラムも書きたい・・


428:デフォルトの名無しさん
09/02/08 00:47:21
型と関数を混同してるような
というか、なんかいろいろ勘違いしてそうに見える

> apply1 ((+)1)、などとしたい
で、一体なにをしたいの?その式を評価して得るものはなに?
まずはその式の「型」を教えてくれないとなんともアドバイスできない

いちおーエスパーしとくとこんなんか?

let apply1 f x = f x
let f = apply1 ((+) 1)
f 2 // val it : int = 3

もしなにか Union Types を使わにゃならんような
理由があるんだったなら教えてほしい

429:デフォルトの名無しさん
09/02/08 02:00:06
ご回答ありがとうございます。
おっしゃるとおり、自分でもたぶん型と関数の違いがあまりわかってないと思います^^;

上の質問をした経緯です
最終的にやりたいことは、let recを用いずにYコンビネータを書きたい
しかし、F#では、次のような呼び出しは型情報が∞ループして決定できない
 let fact self n = if n=1 then 1 else n * ((self self) (n-1)) in fact fact 10;;
そこで、まずは、再帰的なデータ型を定義して用い、上記のような呼び出しを通るようにしたい
(再帰的に'aを'a->'bに置き換えるような型)

しかし、再帰的なデータ型とか、あまりプログラミング経験がないので
型情報を扱うプログラムからまず取り組むことにしたが、つまづいた、とう状況です

上のプログラムですが、次のようにするとコンパイルは通ります。
let apply1 f:FUNC<int,int> = f 1;;
val apply1 : (int -> FUNC<int,int>) -> FUNC<int,int>
しかし、自分が求めた型は
val apply1 : FUNC<int,int> -> int
なのですが、なぜこうなるのかはさっぱりわかってません


430:デフォルトの名無しさん
09/02/08 08:51:24
MLでYコンビネータを書く話なら、↓の最後にコードが載ってる
私には内容がさっぱり理解できないので、参考になるかどうかは分からんが

URLリンク(www.kurims.kyoto-u.ac.jp)

431:デフォルトの名無しさん
09/02/08 09:55:54
>>427 は、↓にすればコンパイルが通るぞ

let apply1 = function (F f) -> f 1;;

432:デフォルトの名無しさん
09/02/08 11:15:40
あっと、別にfunction使う必要はなかった

let apply1 (F f) = f 1;;

433:デフォルトの名無しさん
09/02/08 13:03:49
>>430,431
ありがとう。とても参考になりました。
let recは言語組み込みのYコンビネータみたいなもんらしいですね
無事できあがったYコンビネータ
type X = Psi_inv of (X -> (int -> int));;
let psi (Psi_inv f) = f;;
let Y g =
let h y = g(fun x -> (((psi y) y) x)) in
h(Psi_inv(h));;
(Y (fun f x -> if x=0 then 1 else x * f(x - 1))) 10;;
しかし、単純にF#に翻訳しただけなので
理解したとは言い難い・・

434:デフォルトの名無しさん
09/02/08 18:21:09
この流れなら書ける

type fix<'a, 'b> =
    Fix of (fix<'a, 'b> -> ('a -> 'b))
let y f =
    (fun (Fix g as h) x -> f (g h) x) (Fix (fun (Fix g as h) x -> f (g h) x))

y (fun f x -> if x = 1 then 1 else x * f (x-1)) 5
// val it : int = 120

[1..10] |> List.map (y (fun f x -> if x <= 2 then 1 else f (x-1) + f (x-2)))
// val it : int list = [1; 1; 2; 3; 5; 8; 13; 21; 34; 55]

435:デフォルトの名無しさん
09/02/08 20:43:02
同じ結論にたどり着いた
type Rec<'a,'b> = R of (Rec<'a,'b> -> ('a -> 'b));;
//version1
let y f =
let ymaker (R proc) = f(fun arg -> (proc (R proc)) arg) in
ymaker (R ymaker);;
//version1 extract
let y f =
(fun (R proc) -> f(fun arg -> (proc (R proc)) arg))
(R
(fun (R proc) -> f(fun arg -> (proc (R proc)) arg))
);;
//version 2
let R_inv (R f) = f;;
let y f =
let ymaker proc = f(fun arg -> (((R_inv proc) proc) arg)) in
ymaker (R ymaker);;
//version 2 extract
let y f =
(fun proc -> f(fun arg -> (((R_inv proc) proc) arg)))
(R
(fun proc -> f(fun arg -> (((R_inv proc) proc) arg)))
);;


436:デフォルトの名無しさん
09/02/10 07:30:35
Programming F#: Rough Cuts Version

By Chris Smith
Rough Cuts Release: February 2009
Print Book Release: October 2009
Pages: 504

俺、この本が出たらF#はじめるんだ・・・

437:デフォルトの名無しさん
09/02/11 02:31:18
のーみそが関数型に染まってくると
「左辺値」「右辺値」という言葉に
妙な違和感を覚えだす

そもそもそんな観念がないというか
あえて言うなら左辺に値などない

てなことを妄想してみたけどどうよ?

438:デフォルトの名無しさん
09/02/11 04:31:13
>>437
概念じゃねーの?

439:デフォルトの名無しさん
09/02/11 08:56:56
>>434-435
lazyに考えれば、もっとシンプルに書けるんじゃね(´・ω・`)?

let rec fix (f : Lazy<_>) = f.Force() (lazy fix f)

let fact = fix <| lazy fun f x -> if x = 0 then 1 else x * f.Force() (x - 1)

do fact 5 |> printfn "%d"

440:デフォルトの名無しさん
09/02/11 09:01:08
>>437
「let x = 1」
これは等式とは思わない方が自然じゃないだろうか。
もともとは数学の論文とかでよく出てくる
「Let x := 1.(xを1と置く。)」とかいう表記を構文にしただけなんじゃないかと想像する。
等式じゃないなら、左辺、右辺とかいう観念はない。

441:デフォルトの名無しさん
09/02/11 09:18:39
おまえら頭いい サイコーだ

442:デフォルトの名無しさん
09/02/11 12:21:03
>>439
>>429 をよく見ろ
> 最終的にやりたいことは、let recを用いずにYコンビネータを書きたい

443:デフォルトの名無しさん
09/02/11 12:55:37
ついでに、let rec 使用可なら lazy を使う必要すらない

let rec fix f x = f (fix f) x
let fact = fix <| fun f x -> if x = 0 then 1 else x * f (x - 1)

444:デフォルトの名無しさん
09/02/11 13:39:14
>>443
> let rec fix f x = f (fix f) x

あー、そっか。x つければ落ちないんだ。(´・ω・`)

let rec fix f = f (fix f)

と書いて、StackOverflowになってたのでlazyにしてた。

445:デフォルトの名無しさん
09/02/11 13:47:41
x はラムダ的に冗長に見えるけど、型推論の重要な手がかりになってるということか。

> let rec fix f = f (fix f);;

val fix : ('a -> 'a) -> 'a

> let rec fix f x = f (fix f) x;;

val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b

446:デフォルトの名無しさん
09/02/11 14:01:31
そのあたりのことってProgramming in OCamlに書いてある
正格評価がどうのこうので。
試してないが、確かこれでもいけたはず
let rec y f = f (fun x -> y f x);;
fun arg -> (proc (R proc)) argの箇所を
(proc (R proc))としないのも同じ理由だと思う

とりあえずfunで包めばOK,みたいな

447:デフォルトの名無しさん
09/02/11 14:31:19
結局、再帰型を使うようにしたら、結論はほとんど同じだった。(´・ω・`)

type Fix<'a, 'b> = Fix of (Fix<'a, 'b> -> 'a -> 'b)

let run_fix (Fix f) = f

let ycomb f =
 let g proc = f (fun arg -> run_fix proc proc arg) in
 g (Fix g)

let fact = ycomb <| fun f n -> if n = 0 then 1 else n * f (n - 1)

448:デフォルトの名無しさん
09/02/11 14:42:02
>>438
正直、「観念」と「概念」の違いがわからんで調べてきた
どちらも「モノコトに対する意識・考え」だが…

* 観念
英語でいう idea の意味に近い
オレオレ解釈的(主観的)
故に観念は多様である

* 概念
英語でいう concept の意味に近い
ふつうはみんなそう解釈するよねー的(客観的)
故に概念は一様である

という違いがあるようだ。

左辺値、右辺値という考え方は、一般に共通の理解を得ている
もの(通念)であり、それらは「概念」と呼ぶのが相応しい
ということかな?

449:デフォルトの名無しさん
09/02/11 14:45:18
>>448
まあニュアンスが伝わればいいんじゃね?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5389日前に更新/121 KB
担当:undef