【.NET】F#について語れ【OCAML】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/08/02 14:03:05
MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
まだまだ英語の情報しかないこの言語について、幅広く語れ。

URLリンク(research.microsoft.com)

2:デフォルトの名無しさん
07/08/02 14:06:09
J#の間違いじゃね?

3:デフォルトの名無しさん
07/08/02 14:08:03
F# のスレっていつの間にかに落ちてたのか
需要無いんかね

4:デフォルトの名無しさん
07/08/02 14:14:43
おおお!!ついにきた!

5:デフォルトの名無しさん
07/08/02 14:22:09
レスの数わずか9で終わったスレ:

>Windows Live プログラミング

5 :デフォルトの名無しさん:2007/05/23(水) 03:51:43
くだらねえ。なんでタダでMSの奴隷にならなあかんの。

7 :デフォルトの名無しさん:2007/06/15(金) 08:37:17
漏れのW-zero3に
LIVEのサービスにシンクロするのを入れたけど
接続しっぱなし、常に電源オンで
頭にきて速攻消した。
OFFICEは付き合いで買ってみたけど
VSはもう川根。

8 :デフォルトの名無しさん:2007/06/15(金) 23:14:07
>>5
Webサービスの類は自前でサーバを作らない限りどこかの会社の奴隷じゃよ

9 :デフォルトの名無しさん:2007/06/16(土) 13:29:16
だからLAMPで組むところが多い

6:デフォルトの名無しさん
07/08/02 14:34:03
ここは6で終わりか

7:デフォルトの名無しさん
07/08/02 14:35:34
7まではいく

8:デフォルトの名無しさん
07/08/02 14:40:07
昔あったF#スレは190レス位で落ちた。
他の関数言語スレも過疎ってるし、単独スレはきついだろうな。

9:デフォルトの名無しさん
07/08/02 14:46:43
せめて、F#〜J#について語れ、とセットにしてはどうだろう?

10:デフォルトの名無しさん
07/08/02 14:48:04
       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
   /  .`´  \
     ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (・∀・∩< C丼以外の#言語を語れ
    (つ  丿 \_________
    ⊂_ ノ
      (_)

11:デフォルトの名無しさん
07/08/02 14:48:10
>>9
G# H# I# ってどんな言語?

12:デフォルトの名無しさん
07/08/02 14:50:41
> H#

目立言語

13:デフォルトの名無しさん
07/08/02 14:59:59
んー?こんな言語できてんだ。
そのうちMSはA#からZ#まで26種類の駄言語を作りかねんな

14:デフォルトの名無しさん
07/08/02 15:01:47
工エエェェ(´д`)ェェエエ工工

15:デフォルトの名無しさん
07/08/02 15:03:32
先にF++を作れよ。

ところでやっぱりドトネト専用言語?

16:デフォルトの名無しさん
07/08/02 15:05:10
>13
昔、そういう1文字言語のリストをどっかで見た覚えが・・・

17:デフォルトの名無しさん
07/08/02 15:26:19
OCamlって具体的にどういう分野が得意なの?なんかおもしろいネタある?

18:デフォルトの名無しさん
07/08/02 15:39:42
F#ってなんだ?
誰か三行で説明してくれ

19:デフォルトの名無しさん
07/08/02 15:40:34
前スレ
スレリンク(tech板)

20:デフォルトの名無しさん
07/08/02 16:02:16
メインフレーム用 JCL# とかどうよ?

21:デフォルトの名無しさん
07/08/02 16:15:05
F#で仕事ある?
スレリンク(tech板)l50


22:名無しさん♯
07/08/02 18:16:21
新スレ記念にState Monadを作ってみましたよ。( ゚д゚)ノ

#light

type State<'s, 'a> = ST of ('s -> ('a * 's))
 with
  static member Run (ST x) = x
  static member Get () = ST <| fun s -> (s, s)
  static member Put s = ST <| fun _ -> ((), s)
  static member Eval x = State.Run x >> fst
  static member Exec x = State.Run x >> snd

type StateBuilder () =
 member b.Return a = ST <| fun s -> (a, s)
 member b.Bind (ST x, f) = ST <| fun s -> let (a, s') = x s in State.Run (f a) s'
 member b.Let (x, f) = f x

let state = StateBuilder ()

let _ =
 state
  { let x = 100
   let! s = State.Get ()
   do! State.Put (x + s)
   return () }
 |> State.Exec <| 1000
 |> (print_any >> print_newline)


(実行結果)
1100

23:デフォルトの名無しさん
07/08/02 22:52:49
URLリンク(ja.doukaku.org)
これどうやればいいのかわからない。誰かヒント下さい。
リフレクションつーことは
URLリンク(research.microsoft.com)
これを使うんだろうけど・・・正直さっぱりわからん。

ていうか、俺能力無さ杉。

>>22
おお!!使う機会あったら使わせてもらいます。

24:デフォルトの名無しさん
07/08/02 23:05:42
コールスタック見れば楽勝でしょ

25:デフォルトの名無しさん
07/08/02 23:21:28
>>24
うーん。そういうのあんましよくわからないんだわ。
でもがんばってみる。ありがとう!

26:デフォルトの名無しさん
07/08/03 01:03:23
C#のをもろパクってこういうのやってみているんだけど常に
_main()が帰ってくる。
bar(), baz()っていう関数名を返すにはどうすればいいんでしょうか。

#light
open System.Diagnostics

let foo() =
  let stck = new StackTrace()
  let frme = stck.GetFrame 1
  let mthd = frme.GetMethod()
  mthd.Name

let bar() = foo()
let baz() = foo()


27:デフォルトの名無しさん
07/08/03 01:13:53
スタックフレームの浅いのはインデックスの大きいところに入ってるでしょ

28:デフォルトの名無しさん
07/08/03 02:11:10
>>27
インデックスってどのインデックス?(GetMethod ?のところ?)
というか、やっぱりStackTraceよくわからない。

29:デフォルトの名無しさん
07/08/04 16:16:58
F#ってmixinできんの?

30:デフォルトの名無しさん
07/08/05 04:22:22
F#のFってFortranのF?

31:デフォルトの名無しさん
07/08/05 05:20:29
function

32:デフォルトの名無しさん
07/08/05 11:30:39
fuck you

33:デフォルトの名無しさん
07/08/05 19:12:51
fuck me

>>30
違います。弄って見れば分るけどFortranとは別物

34:デフォルトの名無しさん
07/08/05 19:39:10
Formula

35:デフォルトの名無しさん
07/08/05 21:48:01
MS による壮大な fiction

36:名無しさん♯
07/08/06 08:16:02
当たり前といったら当たり前だけど、guardがきちんと動いた。

#light

open Seq

type SeqBuilder () =
 member b.Return a = singleton a
 member b.Bind (m, k) = map_concat k m
 member b.Let (x, f) = f x

let seq = SeqBuilder ()

let guard = function
 | true -> singleton ()
 | _ -> empty

let _ =
 seq { let! x = {1..10}  (* from *)
    do! guard (x > 5) (* where *)
    return (x * x) }  (* select *)
 |> iter (string_of_int >> print_endline)

(実行結果)
36
49
64
81
100

37:デフォルトの名無しさん
07/08/06 10:02:31
>>36
完全に記法の問題だけど、seqの後の{ }がやっぱキモい

38:デフォルトの名無しさん
07/08/06 10:16:25
このスレはのびない。

39:デフォルトの名無しさん
07/08/06 14:15:14
夢にF#が出てきてびびった

40:デフォルトの名無しさん
07/08/06 14:30:57
F#チラッといじてるが、これかなりいいんじゃね?
でかいアプリ作ったときの安定性がどうだか気になるけれど、使いこなせばC#よりはるかにGenericプログラミングできて生産性があがりそう。
VSでの使いかってもまぁまぁだし。

41:デフォルトの名無しさん
07/08/06 14:37:23
よく知らないんですが、
40の意見って何てアストロターフィング?

42:デフォルトの名無しさん
07/08/06 14:51:56
関数型言語が理解できないのなら黙っとけ

43:デフォルトの名無しさん
07/08/06 17:11:39
.NETのgenericsって高階型が使えないのが痛い。

44:デフォルトの名無しさん
07/08/06 19:04:22
IOモナドどうやって作ろう?

45:デフォルトの名無しさん
07/08/06 19:25:23
>>44
URLリンク(haskell.g.hatena.ne.jp)
URLリンク(haskell.g.hatena.ne.jp)

実は>>22のState Monadほとんどそのままだったりする。

46:デフォルトの名無しさん
07/08/06 19:55:21
>>45
実装じゃなくて「入出力する」ということはどういう感じにしたら
モナドになるんだ?って話。

>>実は>>22のState Monadほとんどそのままだったりする。

実は別にState Monad使わなくても作れたりするらしい。
もともと抽象的な実装方法というものがあってそれを満たすものがあれば
なんでもいい。(一番自然なのはStateMonad使う方法になるんだろうけど)

47:デフォルトの名無しさん
07/08/06 19:58:31
よく読んだら意味わかんないこと言ってるな。
つまりその実装で一体何を作ったのか?ってこと
(副作用出ないが云々は抜きで)

48:デフォルトの名無しさん
07/08/07 16:12:03
Foundation of F#って良い感じ?
買ってみようかどうか迷ってるのだが。

49:デフォルトの名無しさん
07/08/09 15:28:45
>>48 良いと思うよ

50:デフォルトの名無しさん
07/08/09 16:15:36
F#と本家Ocamlってやっぱ違う??
URLリンク(oandrieu.nerim.net)
ここにあるものってF#で使えますかね??特にGsl。

51:・∀・)っ-○◎●
07/08/10 02:03:12
岡村

52:デフォルトの名無しさん
07/08/10 08:36:23
OCamler

53:デフォルトの名無しさん
07/08/16 08:27:50
見事に過疎ったな。

54:デフォルトの名無しさん
07/08/16 11:06:15
(´∀`∩)↑age↑

55:デフォルトの名無しさん
07/08/16 14:00:58
⊃・ ・〃 |age|

56:デフォルトの名無しさん
07/08/16 21:35:20
Windows を使っている層と OCaml を使っている層は相容れない感じがするからねえ…

57:デフォルトの名無しさん
07/08/17 12:07:05
F#perになろうとおもってるんだが、いまやってるC#の仕事が落ち着かん(´;ω;`)…

58:デフォルトの名無しさん
07/08/17 21:33:53
ていうか、OCamlって実はユーザ少ないのか?
Scheme >>> OCaml > Haskell
ぐらいかと思っていたけど
実は
Scheme >>> Haskell >> Ocaml
なんじゃまいか

59:デフォルトの名無しさん
07/08/17 21:37:23
もしそうなら現在においては
OCaml >>>>>> F#
なのでOCamlユーザの絶対数が少ないのならF#使いの数は・・・。

60:デフォルトの名無しさん
07/08/18 01:51:41
nagoyaでやれ

61:デフォルトの名無しさん
07/08/18 15:02:24
>>58
Schemeをネタに優越感に浸ってる香具師はよく見かけるが
そういう香具師が仕事で使ってるのはJavaだったりするし
小物ツールはRubyで書いてたりするのがほとんどな希ガス

62:デフォルトの名無しさん
07/08/20 09:12:36
Matrix,LinearAlgebraライブラリに固有値計算の関数ってある?
探しても無いからこれはMatlabあたりと連携させる必要があるのかなぁ。

63:デフォルトの名無しさん
07/09/01 13:43:37
あげ

64:デフォルトの名無しさん
07/09/02 14:01:50
LINQをTECPreviewじゃない正式版として使えるのはいつごろでしょうか?

65:デフォルトの名無しさん
07/09/02 17:35:21
>>64
FLinqサンプルが、May 2006 CTPじゃなくて.NET 3.5 Beta2(以降)に対応しないかってこと?
まあ、FLinqはあくまで標準ライブラリじゃなくてサンプルだから、対応の優先度は低いと思う・・・。

66:デフォルトの名無しさん
07/09/02 17:46:24
>>65 いや、ベータじゃないバージョンでリリースされてるのかということ。
自己責任だとしても製品に使っていいものかどうか。

67:デフォルトの名無しさん
07/09/03 23:14:51
>>66
LINQ自体(.NET 3.5)はまだベータで、RTMは年末頃だけどそういう話?



68:デフォルトの名無しさん
07/09/04 01:15:25
>>67 そういう話。さんくす。


69:デフォルトの名無しさん
07/09/04 14:38:45
全部lazyにしとけば遅延評価として正常に動作するもんどすか?
それともHaskelとかと比べて注意しないといけないとこあり?

70:デフォルトの名無しさん
07/09/28 00:02:20
age

71:デフォルトの名無しさん
07/10/05 07:06:18
普段 Visual C++ で業務アプリ書いている俺が
酔狂で関数言語(関数型言語?)をいじってみようと思うんだけど、
ocaml と haskell とどちらがお勧め?
手続きがたべったりの俺には無理?

72:デフォルトの名無しさん
07/10/05 08:37:50
だから、ドトネッツはクラスベースだって。

73:71
07/10/05 09:24:00
F# 入れてみた。おもしれぇ。
Visual Haskell も入れてみたけど、とっつきにくかった。
URLリンク(www.haskell.org)
そういやなんでも IL 上でつくられてね?
IronPython とか IronRuby とか。

74:デフォルトの名無しさん
07/10/05 09:30:50
J#は?

75:デフォルトの名無しさん
07/10/05 09:32:03
JAVAとC#どちらが優れているか教えてください Part2
スレリンク(prog板:196番)

いまのオープンソースの流れから考えてもC#は数年後には今のJ#と同じ道を辿る。

利潤追求の激しい企業が本来ならば仲間にしなければならない開発者までも食い物に
していることも分からず、M$マンセーしている奴は頭を齧られ過ぎて考えることも出来ない
くらいに脳みそがなくなっているんだろ。可哀想だよ。

76:デフォルトの名無しさん
07/10/05 09:52:10
>>71
はじめはOCamlで、慣れてきたらHaskellもやってみるのがよろしいかと。

OCamlだけだと遅延評価とか関数合成あたりが学びづらいし、
Haskellだけだと再帰とかモジュールシステムあたりが学びづらい。

77:デフォルトの名無しさん
07/10/05 10:01:19
____________________________
         (^o^)ノ オワタ   三┌(^o^)┘オワタ          /|
         ノ( ヘヘ       三 ┘>     三 ┌(^o^)┘オワタ | ミ
   (^o^)ノ オワタ        三 ┌(^o^)┘オワタ    ┘>/   |   ミ \( ^o^)/ オワタ
   ノ( ヘヘ    (^o^)ノ オワタ  三  ┘> ┌(^o^)┘オワタ    /    ミ  |_/
          ノ( ヘヘ           三  ┘>  /   / |       ノ ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|   /   |  ミ
                                    |  /    |  ヽ(^o^ )ノ オワター      ミ \( ^o^)/ オワタ
_____________________|/      |  \(\ノ             ミ |_/
                              |        |         ミ          ノ ノ
                              |        |        ミ \( ^o^)/ オワタ
  ______    ______      |        |            |_/
  ||//        .||   ||//       ||     │        |            ノ ノ
  ||/       .||   ||/          ||     │        |
  ||        ||   ||._____________ ...||     │        |              ミ
  ||        ||   |||  (^o^)  |  ||     │        |               ミ\(^o^)/ オワタ
   ̄ ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄ ̄      |        |                  ┘|



78:デフォルトの名無しさん
07/10/05 10:02:50
Adobe『AIR』は、「MSによるオフィスアプリ支配」を崩すか
URLリンク(wiredvision.jp)


79:デフォルトの名無しさん
07/10/05 10:31:33
URLリンク(journal.mycom.co.jp)

80:デフォルトの名無しさん
07/10/05 10:57:46
J#って何のためにあるの?
スレリンク(tech板)l50


81:71
07/10/05 12:58:50
>>75
C# はどうなるかわかんないけど、
C++/CLI の出来はいいと思うよ。
Managed C++ でいろいろと改良点が指摘されて
それが十分に生かされていると思う。

82:デフォルトの名無しさん
07/10/05 13:01:43
基地外にマジレス不要

83:デフォルトの名無しさん
07/10/05 17:17:39
うほ。
System.Windows.Forms とか見えてる・・・
もしかして俺が C# で書いたフォームを
Haskell から呼び出したりできるのか??

84:デフォルトの名無しさん
07/10/05 17:18:14
Haskell じゃなかった、 F# だた。
両方並行していじってると頭がおかしくなるみたい。

85:デフォルトの名無しさん
07/10/05 18:05:32
出来るお(´・ω・`)

86:デフォルトの名無しさん
07/10/05 20:09:58
F#速いお
OCamlよりも速いお
立ち上がってからの話だけど・・・
ちょっと言ってみたかっただけだお

87:デフォルトの名無しさん
07/10/05 20:52:17
Python並みにコードが短く、C#のように実行が速い
URLリンク(www.strangelights.com)

88:デフォルトの名無しさん
07/10/05 23:21:11
C#って速いか?
C#って速いか?
C#って速いか?
C#って速いか?
C#って速いか?

89:デフォルトの名無しさん
07/10/05 23:29:39
遅いのはGDI+

90:デフォルトの名無しさん
07/10/06 01:02:09
初回起動時のコンパイルもかな

91:デフォルトの名無しさん
07/10/06 07:23:48
>>88
速いと思うよ。 >>90 が言うように初回起動時に
JITコンパイラのようなものが働いているみたいで、
確かにデバッグ・実行繰り返しているときに
いらいらすることがある。デバッグコードだから
かもしれないけど。

あと、実際に多用するかどうかはともかくとして、
C#だとどうしても速く書けない部分があっても
DLLの呼び出しが簡単なので、Cやアセンブラで
書いたコードを呼び出せるし。Javaのネイティブ
メソッドよりも簡単に。

92:デフォルトの名無しさん
07/10/06 09:43:34
>>91
interopでのDLLやCOMの呼び出しは確かに簡単だが、マーシャリングの
コストが高いので細切れにCの小さなコードを呼ぶような使い方はすべきでない。

そういうことがしたいなら、むしろC++/CLIを使うべきだろう。

93:デフォルトの名無しさん
07/10/06 11:46:01
>>92
C#のP/InvokeとC++/CLIの暗黙のP/Invokeのマーシャリングにかかるコストは実は差がない。
違いはC++/CLIではデフォルトでSupressUnmanagedCodeSecurityAttributeが付加され、
C#は付かないということ。
C#のP/Invokeに[SupressUnmanagedCodeSecurity]をつけると途端に速くなるから試してみるといい。

94:デフォルトの名無しさん
07/10/06 17:26:28
UTF-8 で書いておけば日本語もおkなんだね。

95:デフォルトの名無しさん
07/10/06 17:43:08
>>93
それってセキュリティ的にどうなの?

96:デフォルトの名無しさん
07/10/06 17:57:10
>>95 セキュリティって文字列に反応しているようだけど、
この設定はセキュリティ関連のチェックを事前にできるように
するかどうかというだけの設定じゃなかったっけ?

ドトネトなプログラムは実行時にたとえば「ディスクへの書き込み
はしちゃだめだからね」なんていうセキュリティ上の制約を
つけて実行することができるようだけど、プログラムが全体として
その制約を満たしているかどうかを実行開始前にチェックできるように
するか、実行時に「おいおい、書いちゃダメだってば」って
例外を出すようにするかって違いじゃないの?

F#の話から外れて申し訳ないが。

97:デフォルトの名無しさん
07/10/17 01:14:32
ほっしゅほっしゅ

入れてみたよ〜。なんだか面白そうだ。


98:デフォルトの名無しさん
07/10/18 04:04:22
>>97
URLリンク(blogs.msdn.com)
うは、Luke HobanがF#チームに異動か。

まあOrcasでの仕事もほぼ終わったところだろうし、いいタイミングなのかも。

99:98
07/10/18 04:05:26
ごめん、>>97は関係ない。

100:名無しさん♯
07/10/18 21:18:06
URLリンク(blogs.msdn.com)

これって、F#を製品化するって話なの?
表現が微妙でそう読み取れないんだけど、反響を見るとそういう扱いになってる・・・。(´・ω・`)

101:デフォルトの名無しさん
07/10/19 07:33:45
Iron ほげほげといい、F# といい、
Visual Studio で何でもありという感じだなぁ。
その一方で、 Visual Studio 2008 Beta 2 見ると
J# がなくなっている・・・
俺としては継続してほしかった。
さらにライセンス的に無理なんだろうけど
JDK 1.6 にも対応してほしかった。
いまは JDK 1.1.4 相当だから。
スレちがいでごめん。

102:デフォルトの名無しさん
07/10/20 05:01:18
wikipedia の F# のページ Wikipedia項目リンク
には F# は科学計算用途に適した言語であるといえる。
F# は、低級だが高速な数値計算言語 (Fortran など) と、
高級だが低速な言語 (Mathematica など) の両方の特徴をもつ。

って書いてあるんですけど、 F# によって matlab や R 言語で処理するような
事柄にむいていますか?向いているなら今から習得して修論に使おうと思って
いるんですけど...

103:102
07/10/20 05:13:28
後、同ページ Wikipedia項目リンク
には、 F# は異なる言語に容易にアクセスすることができ、
LAPACK や FFTW などといったライブラリの利用が容易である。

と書いてありますが、これは、 C 言語など低級の言語のみならず、 matlab や
mathematica や R 言語などにもアクセスする事は可能なんでしょうか?

104:デフォルトの名無しさん
07/10/20 12:13:22
言語による

105:デフォルトの名無しさん
07/10/20 17:38:14
Cにはアクセスできるよ。
ほかのはCからいけるならとりあえずラッパコード書けばいけんじゃね?

106:デフォルトの名無しさん
07/10/20 18:28:41
matlab や R はインターフェイスがネイティブの C だよね?
なので C++/CLI でラッピングすればドトネトの世界から
アクセスできる。当然 F# からもアクセスできる。
でもあんまり F# 使う意味ないんじゃね?

俺にとっての F# を使う意義と言えば、
Visual Studio の中で仕事しているふりをしながら
現実逃避できるというところだろうか。

107:102
07/10/21 23:58:45
>>105>>106
確かに、そうなると F# 使う意味なくなりますね...
それはそうと、 >>102

F# は科学計算用途に適した言語であるといえる。
F# は、低級だが高速な数値計算言語 (Fortran など) と、
高級だが低速な言語 (Mathematica など) の両方の特徴をもつ。

っていう記述は本当なのですか?もし本当なら、院生にとっては
夢のような言語のような気がするんですけど...

108:デフォルトの名無しさん
07/10/22 01:29:32
>>107
F#というよりベースになってるOCamlの特徴かな。
それなりの訓練は必要だが関数型言語はある種の科学技術計算に向いてる。
ただ、これを高級と呼ぶかどうかは知らんし、手続き型がいい場合もある。
関数型言語の多くは遅延評価で弱い型付けであるが、
OCamlは正確(遅延評価でないという意味)で、推論でしっかり型付けされるため、
コンパイルが可能でパフォーマンスがいい。
問題はまだ新しい言語でライブラリが充実してないところ。

109:デフォルトの名無しさん
07/10/22 10:41:59
>>107
どっかのページに大学院生でOCaml使っていて、こんなに(・∀・)イイ!!言語なのになんでマイナーなんだろうとかいう記述があったぞ
>>108
F#なら.NETのライブラリが使えるお

110:デフォルトの名無しさん
07/10/23 21:05:48
正格だよね

111:デフォルトの名無しさん
07/10/23 23:34:50
>>108
> OCamlは正確(遅延評価でないという意味)
正格だボケ

112:デフォルトの名無しさん
07/10/24 00:24:58
ボケはお前だ

113:デフォルトの名無しさん
07/10/24 05:59:26
VC# expressしか持ってないんですが
この場合VS上でのF#プログラミングって使えるんですかね

114:デフォルトの名無しさん
07/10/24 07:45:50
Expressは駄目。たしか、IronPythonのも駄目だった。
いまお金かけないとすると、VS2008のbetaですかね。

115:デフォルトの名無しさん
07/10/24 09:38:06
2008 Beta2 Standardがおすすめ

116:デフォルトの名無しさん
07/10/24 10:25:49
F#はじめました。クロージャもどきを作ってみましたが、
let rec makeclr v n = 
    let pr n = printf "closure %d\n" n in
      if n < 1 then v else (fun () -> pr(n)) :: (makeclr v (n - 1))
let makecl = makeclr [] ;;
let v = makecl 10 in
  List.iter (fun x -> x()) v ;;

リストの後方に追加するスマートな方法があったら教えてください。
逆にしたら怒られた。
(makeclr v (n - 1)) :: (fun () -> pr(n)) 

117:デフォルトの名無しさん
07/10/24 13:42:18
>>116
3行目で if n < 1 then rev v が定石かと思われ。

(makeclr v (n - 1)) @ [fun () -> pr n] は効率の面でおすすめできない。(´・ω・`)

118:デフォルトの名無しさん
07/10/24 14:37:10
>>117
ありがとう。最後にまとめて反転させたほうが早いわけですね。
末尾再帰になってなかったのでそうしたら反転の必要もなくなりました。
最初はforやwhileを使ってたのですがなんだかうまくないようです。
あまりforやwhileは使わないのでしょうか。配列専用の機能のように思えました。

let rec makeclr v n = 
      if n < 1 then v else makeclr ((fun () -> printf "closure %d\n" n) :: v) (n - 1)
let makecl = makeclr [] ;;
let v = makecl 10 in List.iter (fun x -> x()) v ;;


119:デフォルトの名無しさん
07/10/24 15:11:11
>>118
ループとしてのfor, whileはほとんど使いません。(つーか、構文忘れてるし・・・。)
ただし、内包表記のforはよく使います。

let makeclr n =
 [ for i in [1..n] ->
   fun () -> printf "closure %d\n" i ]

でもまあ、最初のうちは再帰で解決する習慣を身につけるべきかと。(´・ω・`)

120:デフォルトの名無しさん
07/10/24 15:12:06
F#のメリットってなんですか?
C#より優れてるところ、劣ってるところはなんですか?
F#にできてC#にできないことってありますか?

121:デフォルトの名無しさん
07/10/24 16:04:01
>>119
こういうforの使い方があるのか。おいしくいただきまます。

122:デフォルトの名無しさん
07/10/24 20:08:41
あかん・・・手続き型べったりの俺には
簡単なコードで頭の体操するのが精いっぱい。

しかし使い慣れた Visual Studio で動くので
なんとなく使えてる気になるけど。
やっぱり理論的な基礎をしっかりとやってない
専門学校上がりのコーダーには扱えないのかね。

Emacs における Emacs Lisp のように、
既存のネイティブ or ドトネトなプログラムの
マクロ言語としておもしろい?とかオモタけど、
妄想だけにしときます。

123:デフォルトの名無しさん
07/10/25 01:28:33
>>118を1行で。

[1..10] |> List.map (fun n () -> printf "closure %d\n" n) |> List.iter ((|>) ())

124:デフォルトの名無しさん
07/10/25 01:30:32
暗号にしかみえんがみなさんはこういうのにメリット感じるの?

125:デフォルトの名無しさん
07/10/25 01:55:17
Microsoft、関数型言語F#をVisual Studioに統合へ―開発者からはおおむね好意的な反応
URLリンク(opentechpress.jp)

126:デフォルトの名無しさん
07/10/25 01:58:35
手を広げすぎ

127:デフォルトの名無しさん
07/10/25 02:12:00
let flip f a b = f b a
let delay f = fun () -> f

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

128:デフォルトの名無しさん
07/10/25 04:27:16
right to leftの方が読みやすいかな。

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

129:デフォルトの名無しさん
07/10/25 08:26:45
型推論ってなんですか?

130:デフォルトの名無しさん
07/10/25 09:46:24
型を推論してくれるんです。

131:デフォルトの名無しさん
07/10/25 09:59:05
やけに賑やかDaNa

132:デフォルトの名無しさん
07/10/29 22:11:15
OCaml は整数型と実数型で足し算の演算子すら違って面倒だという話を聞いたことがありますが,本当ですか?
F#もそうなってるんですか?

133:デフォルトの名無しさん
07/10/29 22:16:40
整数の演算子 :
+ - * /

実数の演算子 :
+. -. *. /.

134:デフォルトの名無しさん
07/10/29 22:47:06
めんどくさ

135:デフォルトの名無しさん
07/10/29 23:50:47
>>132

> 1 + 0.1;;

  1 + 0.1;;
  ----^^^^

stdin(7,4): error: FS0001: This expression has type
        float
but is here used with type
        int
stopped due to error

> 1.0 + 0.1;;
val it : float = 1.1

> 1.0 +. 0.1;;

  1.0 +. 0.1;;
  ----^^^

stdin(9,4): warning: FS0062: This construct is for compatibility with OCaml. Use
 the overloaded infix operator '+' instead. Disable this warning using --no-warn
 62 or #nowarn "62"
val it : float = 1.1

136:デフォルトの名無しさん
07/10/30 10:22:05
>>132
F#では演算子は共通になった。
.NETのサポートするデータ型を全部サポートしなきゃいけないのでこうなったものと思われる。
ただし暗黙の型変換はないので整数+実数の計算は変換が必要になる。

> 3.2 + float 2;;
val it : float = 5.2

137:デフォルトの名無しさん
07/10/30 10:24:25
F#ってVS2008についてくんの?

138:デフォルトの名無しさん
07/10/30 13:41:11
OCamlってフランス製だっけ?

139:デフォルトの名無しさん
07/10/30 15:13:40
そうざます

140:デフォルトの名無しさん
07/11/07 23:39:11
おフランスwww

141:デフォルトの名無しさん
07/11/13 01:04:38
140が見えない

142:デフォルトの名無しさん
07/11/14 00:21:33
なんで?

143:名無しさん♯
07/11/19 14:52:34
F# 1.9.3.4が出ますた。( ゚д゚)ノ

Asyncの実装がまた微妙に変わってますがな・・・。(´・ω・`)

144:デフォルトの名無しさん
07/11/19 16:38:48
おぉ〜

この言語は普及するのかな

145:名無しさん♯
07/11/19 20:25:01
ありゃ、ライブラリのマニュアル、バージョン古いままだ・・・。(´・ω・`)

146:デフォルトの名無しさん
07/11/19 23:47:01
普及するわけないだろwwwwwwwwwww

147:デフォルトの名無しさん
07/11/20 16:06:16
並列計算の需要がものすごく増えてきてるから普及するんじゃないかねぇ

148:名無しさん♯
07/11/20 16:20:04
Async型って、Haskellで

 type Async a = Cont () (Either a Exception)

って脳内変換すれば、unit, bindの実装の意味が理解できることに最近気がついた。

で、ごく一部の方々がActionを使った継続をやけに議論してた意味もようやくわかった。(つД`)

149:名無しさん♯
07/11/20 20:05:10
Eitherじゃぜんぜんダメだった・・・。orz
エラー系の継続を最初からずっと保持してなきゃならんので、結局

 type Async a = (a -> (), Exception -> ()) -> ()

こうするしかないですわ。(´・ω・`)

でも、Asyncってモナド則を満たしてるんかいなという新たな疑問も・・・。

150:名無しさん♯
07/11/20 20:14:12
あ、型コンになってなかった。(´・ω・`)

 data Async a = Async ((a -> (), Exception -> ()) -> ())

151:名無しさん♯
07/11/21 08:05:42
Asyncを単純化するとこんな感じなのかな?( ´・ω・)


#light

type Async<'a> = Async of (('a -> unit) * (exn -> unit) -> unit)
 with
  static member Run (Async x) = x

let unit a = Async (fun (cont, _) -> cont a)

let bind m k =
 Async (fun (cont, econt) ->
  let cnext = fun a -> try Async.Run (k a) (cont, econt) with exn -> econt exn
  Async.Run m (cnext, econt))


で、実際にはここでのunit→resultPrim, bind→bindAsyncPrim相当でしかなくて、
これにキャンセルサポート(AsyncGroup)を追加してはじめてresultAsync, bindAsync相当になる、と。

モナドの定義自体にはスレッド云々は関係なくて、モナドを起動する側(Run, Spawn)の方で
スレッドに結びつけてる、と。

これをC#で表現するのはめんどいのう。(´・ω・`)

152:デフォルトの名無しさん
07/11/21 13:31:20
関数型言語は図で説明できますか?
フローチャートのように。
それが出来ないと、企業で使うのは難しいと思う。


153:デフォルトの名無しさん
07/11/21 13:48:56
フローチャート(笑)

154:デフォルトの名無しさん
07/11/21 13:53:48
次の質問をどうぞ

155:デフォルトの名無しさん
07/11/21 14:30:48
質問が正確じゃないな。

  「Javaはむずかしすぎて使えません!」とギャグでなく主張する
  ド低脳にとっては関数型言語のほうが簡単なのですか?
  そうでないと、ドカタが使うのは難しいと思う。

こうだろ。

156:デフォルトの名無しさん
07/11/21 14:38:19
おもしろくないよ

157:名無しさん♯
07/11/21 21:33:54
あ、>>151間違えとる。(´・ω・`)

Async.Runは Async<'a> -> 'a にしないとダメなのか・・・。
>>151の実装は flip asyncApp 相当に過ぎないか。

158:名無しさん♯
07/11/22 01:13:05
うーん、やっぱりキャンセルサポートなしでAsync.Runまで作っても複雑になるなあ・・・。

#light

type Async<'a> = Async of (('a -> unit) * (exn -> unit) -> unit)

let app (Async x) = x

let unit a = Async (fun (cont, _) -> cont a)

let bind m k =
 Async (fun (cont, econt) ->
  let c = fun a -> try app (k a) (cont, econt) with exn -> econt exn
  app m (c, econt))

let catch p =
 Async (fun (cont, _) ->
  app p (cont << Choice2_1, cont << Choice2_2))

let start p = app p ((fun () -> ()), (fun exn -> raise exn))

type Async<'a> with
 static member Run p =
  let res = ref None // val res : Choice<'a, exn> option ref
  let cont = fun r -> res := Some r; unit ()
  start (bind (catch p) cont)
  match Option.get !res with
  | Choice2_1 a -> a
  | Choice2_2 exn -> raise exn

これでAsync.Spawn, Async.Parallelまで挑戦するのは無理ぽ。(´・ω・`)

159:デフォルトの名無しさん
07/11/22 12:12:02
1.9.3.6リリース

160:デフォルトの名無しさん
07/11/22 23:56:53
>153-154
図星だったようだね。


161:デフォルトの名無しさん
07/11/23 00:06:19


162:デフォルトの名無しさん
07/11/23 01:28:54
政治的な理由で図が必要なら、Executable UMLでも
使ってれば?
あと>>155が答え。

163:名無しさん♯
07/11/23 12:20:33
CPSだとアピールするよう、>>158のstartをプチ改良。w

let id x = x

let start p = app p (id, (fun exn -> raise exn))

164:名無しさん♯
07/11/23 17:12:31
これはすばらしすぎるwww
URLリンク(channel9.msdn.com)

コメント欄もなかなか熱い。(;^ω^)

165:デフォルトの名無しさん
07/11/24 01:29:29
もうちょっとHaskellよりなOCamlがいいと思う

166:デフォルトの名無しさん
07/11/24 01:46:59
OCamlは副作用に対して寛大で、保守性や開発効率を保ったまま言語仕様を定めるのが忙しくて
165の様な要望に対しては手一杯

167:名無しさん♯
07/11/27 22:37:56
F#のオブジェクト機能をちょっとまじめに使ってみますた。( ゚д゚)
URLリンク(cid-c42499cb3a347006.skydrive.live.com)

168:デフォルトの名無しさん
07/11/28 01:53:52
日本語の解説はないの?
htmlは読みにくいからpdfのドキュメントはないの?

169:名無しさん♯
07/11/28 17:21:32
両方ともにすばらしい。(´ー`)

(.ppt注意)
URLリンク(qcon.infoq.com)
URLリンク(qcon.infoq.com)

モナドの観点では、LINQの標準クエリ演算子で最重要なのは実は SelectMany なのね。


>>168
日本語の解説は見たことないです。
英語のなら最近すごくいい入門記事が出ましたが・・・。

URLリンク(tomasp.net)

170:デフォルトの名無しさん
07/11/28 21:07:15
>>169
モンドリアン風なのが気に入ったw

171:デフォルトの名無しさん
07/11/29 01:54:58
F#がC#より優れている点ってあるの?
すべてにおいてC#が優っているように思えるのだが。

172:デフォルトの名無しさん
07/11/29 02:04:46
んじゃC#使えばいいじゃにあか

173:デフォルトの名無しさん
07/11/29 02:06:18
そうだけど何かメリットがあるならF#を使ってみようかと思って。
無いなら使わないけど。

174:デフォルトの名無しさん
07/11/29 04:51:48
F#とC#は使い所が違うんじゃないかな

175:デフォルトの名無しさん
07/11/29 05:38:33
(::)が関数として使えないんだけどそういうもん?

176:デフォルトの名無しさん
07/11/29 20:23:52
F#の機能とかっていずれC#も取り込みそうな気がする。C#って何気に巨大言語だよね。

177:デフォルトの名無しさん
07/11/29 20:49:05
へじたんの夢の固まりだからな

178:デフォルトの名無しさん
07/11/29 21:22:37
C#でできることすべてはF#でできない。
F#でできることすべてはC#でできる。


179:デフォルトの名無しさん
07/11/30 01:29:16
逆だろ

180:デフォルトの名無しさん
07/11/30 01:30:02
逆じゃない。

181:デフォルトの名無しさん
07/11/30 01:41:23
C#、F#でできることの集合をそのままC#、F#と書く
1行目から C# ∩ F# = φ
2行目から F# ⊆ C#

∴F# = φ

アッー

182:デフォルトの名無しさん
07/11/30 01:45:50
aho

183:デフォルトの名無しさん
07/11/30 01:52:06
(C#でできることすべて)はF#でできない。
ではなく
C#でできることにはF#でできないことがある。
という意味なのか

184:デフォルトの名無しさん
07/11/30 01:59:02
仕様書でこういうどちらとも取れる言葉遣いをしていたら揉め事の種になるな

185:デフォルトの名無しさん
07/11/30 02:00:23
F#使ったことないけど、
C#では

var f = i=>i

で型推論が働かず、コンパイルが通らない。
F#ではできる!(=F#でしかできない事)

という認識で良いでしょうか?

186:デフォルトの名無しさん
07/11/30 09:14:42
開発はなに使ってますか?VS2008?

187:名無しさん♯
07/11/30 10:30:03
気がつけば、F# 1.9.3.7にマイナーアップデート。
URLリンク(research.microsoft.com)

そして待望のこれ。F#との相性よろし。(´ー`)
URLリンク(www.microsoft.com)

改めてこちらにも注目。
URLリンク(research.microsoft.com)

188:デフォルトの名無しさん
07/11/30 10:50:05
C#で航海関数(なぜか変換できない)かけるのかとこ一時間

189:デフォルトの名無しさん
07/11/30 10:58:20
ハァ?

190:名無しさん♯
07/11/30 18:05:31
System.Linq.ParallelEnumerable
System.Linq.Parallel.Enumerable

まぎらわしい・・・。(´・ω・`)
前者はIParallelEnumerable用、後者はIEnumerable用。

191:名無しさん♯
07/11/30 19:00:00
ParallelEnumerableに、ForAllなんていうAction系の拡張メソッドが。
オリジナルのEnumerableにもこれ付けてほしかったのに。(つД`)

192:名無しさん♯
07/11/30 19:36:06
Parallel.Aggregateはどこへ行った?と思ったら、

 Parallel.For<TLocal>
 Parallel.ForEach<TSource, TLocal>

がその代わりらしい。でも、使い方がちょっとわかりにくい・・・。(´・ω・`)

193:名無しさん♯
07/11/30 20:05:28
>>191のForAllは、inverted enumerationというやつだった。
ForEachのつもりで使うと、順番がバラバラで困ったことになる。

MSDN Magazineできちんと解説してた内容をすっかり忘れてた・・・。orz
URLリンク(msdn.microsoft.com)

194:デフォルトの名無しさん
07/11/30 23:25:34
URLリンク(research.microsoft.com)
URLリンク(www.microsoft.com)
URLリンク(research.microsoft.com)

195:名無しさん♯
07/12/01 00:16:49
SEQUENTIAL_THRESHOLDがからむと、チューニング(値決め)がむずかしそうですのう。(´・ω・`)

196:名無しさん♯
07/12/01 13:20:31
TPLむずかし杉ワロタw

#r "System.Core.dll";
#r "System.Threading.dll";

#light

open System
open System.Linq
open System.Threading
open Int32

let _ =
 let sum = ref (to_int64 0)
 do Parallel.For(0, 1000000,
         new Func<_>(fun _ -> !sum),
         new Action<_,ParallelState<_>>(fun i st ->
          st.ThreadLocalState <- st.ThreadLocalState + (to_int64 (i + 1))),
         new Action<_>(fun localSum -> Interlocked.Add (sum, localSum) |> ignore))
 Console.WriteLine("TPL  : {0}", !sum)

let _ =
 let seq = ParallelEnumerable.Range(1, 1000000)
 ParallelEnumerable.Aggregate(seq, to_int64 0, new Func<_,_,_>(fun sum i -> sum + (to_int64 i)))
 |> fun sum -> Console.WriteLine("PLinq : {0}", sum)

197:名無しさん♯
07/12/02 01:01:31
dual coreでのパフォーマンスアップは1.5〜1.6倍といったところでしょうか。
quadで動かしてみたいのう。(´・ω・`)

198:名無しさん♯
07/12/02 23:54:31
F#じゃないけど、こんなのを取りまとめ中。
URLリンク(cid-c42499cb3a347006.skydrive.live.com)

C#も十分関数的ですのう。(´・ω・`)

199:デフォルトの名無しさん
07/12/03 03:17:53
なんかむずむずする関数名だな。

200:デフォルトの名無しさん
07/12/03 04:41:19
>>198
・Unitは確かにムズムズするな。unit 型と混乱しそう。
・IsEmptyの実装は Enumerable.Count<T>使うより
 Enumerable.Any<T>使った方が良いんでは?
 Count使うと無限リストで死ねる。
 てかAnyがあるからIsEmpty要らん気もするけど。個人的には。

201:デフォルトの名無しさん
07/12/03 09:10:48
C#もラムダ式で再帰を書く方法の改善と末尾再帰の最適化をやってくれるようになったら
関数型っぽく遊べるようになるんだがな。

202:デフォルトの名無しさん
07/12/03 09:14:32
その辺は棲み分けでしょ
.net frameworkって糊を上手く使う所ってことで

203:名無しさん♯
07/12/03 10:49:17
>>200
コメント感謝です。

> ・Unitは確かにムズムズするな。unit 型と混乱しそう。

前は「Lift」って名前にしてたんですが、そっちの方がわかりやすいでしょうか?

> ・IsEmptyの実装は Enumerable.Count<T>使うより
>  Enumerable.Any<T>使った方が良いんでは?

Anyの使い方を知らなかっただけでつ。(´・ω:;.:...
勉強になりますのう。

204:デフォルトの名無しさん
07/12/03 11:17:49
>>203
個人的にはLiftで良いと思う。
ただ、.NET全般として見たときには
Nullableのところで"Lift"を使っちゃってて面倒鴨。

URLリンク(msdn2.microsoft.com)(VS.90).aspx

monadがあればこの辺のメタな名前の衝突は回避できるというか統合できるのかのぅ。

205:名無しさん♯
07/12/03 11:29:57
>>204
修正しますた。ついでに使用例も。( ゚д゚)ノ
URLリンク(cid-c42499cb3a347006.skydrive.live.com)

> monadがあればこの辺のメタな名前の衝突は回避できるというか統合できるのかのぅ。

monoid派が「Unit, Bindにすべし!」と言い出す悪寒・・・。

206:名無しさん♯
07/12/03 23:16:44
うーん、結局のところ

 かなり必要 → ZipWith
 できれば必要 → Lift (T -> IEnumerable<T> のインターフェイスで)

ぐらいで、他は別にイラネって感じかもしれん・・・。(´・ω・`)

207:名無しさん♯
07/12/03 23:35:51
Cycleは漏れ的にはお気に入りだけど、実際には使わんよなあ・・・。(;´Д`)

208:デフォルトの名無しさん
07/12/04 00:29:38
OCamlは糞言語だな。F#は大丈夫なんだろうな。

209:名無しさん♯
07/12/04 20:11:20
TPLは、TaskManagerPolicyを変えて、ParallelよりもConcurrentライブラリとして使えば便利かもしれん。
でもそれって何てjava.util.concurrent?(´・ω・`)

210:デフォルトの名無しさん
07/12/20 02:46:46
Lisp系に比べるとML系って泥臭いというか、洗練されていない感じがする。頭悪そうな感じ。

211:デフォルトの名無しさん
07/12/21 08:06:21
でも得てしてそういう言語の方が広まったりしない?

212:デフォルトの名無しさん
07/12/21 08:42:24
MLは普及してないだろ。

213:デフォルトの名無しさん
07/12/21 14:10:28
まさに目くそ鼻くそ

214:デフォルトの名無しさん
07/12/21 14:41:19
MS は # シリーズが Z までいったら,
次は $ シリーズを展開してくれると期待している.

215:デフォルトの名無しさん
07/12/21 23:44:56
M$

216:デフォルトの名無しさん
07/12/23 23:59:49
>>210
CL, Scheme, SML, OCaml なんかを比べているのであれば、
どれも大差無い様に見えるけど。歴史的に一番泥臭いのは
CL だろうけど…

217:名無しさん♯
07/12/24 10:52:24
Scalaの言語仕様もよくできてますなあ。
F#よりもHaskellに近い希ガス。
もしかしたら、C# 4.0のヒントもこの中にあるのかもしれん。(´・ω・`)

218:デフォルトの名無しさん
07/12/24 11:24:46
気になる開発プロダクツ
第7回 Scala 2.6.0-final
URLリンク(gihyo.jp)

初めて名前聞いた.

ところでみんな将来的には業務に使おうと思ってF#とか
関数型言語をいじってるの?

219:デフォルトの名無しさん
07/12/26 03:54:29
Scala、Rubyみたいな言語だなw

220:名無しさん♯
07/12/26 11:42:54
一部で話題になってる論文。
URLリンク(www.cs.kuleuven.be)

これをJVM上の言語で実現したのはすごいなあ。

一方、.NETの方では・・・。(´・ω・`)
URLリンク(www.haskell.org)

221:名無しさん♯
07/12/26 21:40:07
いちおう動いたけど、なんか間違えてるような・・・(´・ω・`)?

trait Monad[M[_]] {
 def returnM[T](x: T): M[T]
 def bindM[T, U](m: M[T], f: T => M[U]): M[U]
}

abstract class Maybe[T]
case class Just[T](x: T) extends Maybe[T]
case class None[T] extends Maybe[T]

object Test {
 implicit object MaybeMonad extends Monad[Maybe] {
  def returnM[T](x: T) = Just(x)
  def bindM[T, U](m: Maybe[T], f: T => Maybe[U]): Maybe[U] = m match {
   case Just(x) => f(x)
   case _ => None()
  }
 }
 def test[T, U](a: Maybe[T], f: T => U)(implicit m: Monad[Maybe]) {
  m.bindM(a, (b: T) => m.returnM(f(b))) match {
   case Just(x) => println(x)
   case _ => println("None")
  }
 }
 def main(args: Array[String]) {
  test(Just(100), (x: Int) => x + x) // 200
  test(None(), (x: Int) => x + x) // None
 }
}

testの第1引数にMaybeを使ってしまうと、Monadで汎化した意味がないような・・・。


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

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