【.NET】F#について語 ..
[2ch|▼Menu]
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で汎化した意味がないような・・・。

222:名無しさん♯
07/12/26 21:52:51
しかも、JustとNone。名前の由来が微妙に混ざってる・・・。orz

223:名無しさん♯
07/12/26 22:23:36
あ、こうすればいいのか。(゚∀゚)

 def test[M[_], T, U](a: M[T], f: T => U)(implicit m: Monad[M]) {
  m.bindM(a, (b: T) => m.returnM(f(b)))
 }

224:名無しさん♯
07/12/26 22:50:55
関数を { 〜 } で囲むと戻り値はUnitになっちゃうのか・・・。なるほど。(;`・ω・)

225:名無しさん♯
07/12/26 23:11:49
修正版でつ。

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 Nothing[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]) = m match {
   case Just(x) => f(x)
   case _ => Nothing[U]()
  }
 }

 def test[M[_], T, U](x: M[T], f: T => U)(implicit m: Monad[M]) =
  m.bindM(x, (y: T) => m.returnM(f(y)))

 def main(args: Array[String]) {
  def p[T](m: Maybe[T]) = m match {
   case Just(x) => println(x)
   case _ => println("Nothing")
  }
  p(test[Maybe,Int,Int](Just(100), (x: Int) => x + x))
  p(test[Maybe,Int,Int](Nothing(), (x: Int) => x + x))
 }
}

226:デフォルトの名無しさん
07/12/27 14:09:13
前、海外でF#使える人の求人あったけどどんなものなのかね?
日本でもかまわんけれど、実際のシステムで使われてるかなど教えてエロイ人

227:デフォルトの名無しさん
07/12/29 14:46:20
>>226
実際は雑用とかだろ

228:デフォルトの名無しさん
07/12/29 14:59:22
このスレ一人しかいないのか知らんけど、過疎ってるからってさすがにつっこむべきかと・・・・
そのコードF#ですか?

>>226
基本的には.netアプリだけど、ASP.NETでスクリプト的に使うんだろうな〜
まあIronPythonもそうだがちゃんとしたフォームデザイナがないとGUIアプリは作りづらいし
当然C#とかVBを置き換わるものではない
ってか常識で考えろ

229:デフォルトの名無しさん
07/12/29 23:12:31
>>228
常識が何をさしてるのか知らんが、別に既存の業務土方アプリ作るのにF#使うことは無いでしょう。
まぁF#のほうが生産性高いとは思うけれど、メンテや技術者の人数から見ても選択されることはないかと。
それよりも自分が見たのは、何かの科学計算に向けての実験的なアプリの作成などに絡む部門だったような。Lispとかの経験でも可とかいってたから何か面白そうなにおいがした。

230:名無しさん♯
08/01/04 22:35:35
Scalaをいろいろと触ってみましたけど、オブジェクトの発想が強すぎて
関数型としては扱いづらいですね・・・。(´・ω・`)

F#の比較対象としては不向きかも。

231:名無しさん♯
08/01/06 21:44:12
fsi --quiet --exec hoge.fs

hoge.fsを実行してそのまま終了。
今までこのオプションを知らんかった・・・。orz

そうなると、DLRの使い道が一気に減ってしまうがな。(´・ω・`)

232:デフォルトの名無しさん
08/01/19 17:56:27
F# 1.9.3.14あげ

233:デフォルトの名無しさん
08/02/02 08:32:45
URLリンク(www.iunknown.com)

IronRubyの中の人による、Lang.NETのまとめ

へじたんのお言葉
I think that the taxonomies of programming languages are breaking down. I think that languages are fast becoming amalgam. ... I think that in 10 years, there won't be any way to categorize languages as dynamic, static, procedural, object, and so on.

だそうで。

F#の学習はいい先行投資かもしれないねぇ。まぁ楽しいからやってるんですし、皆さんそうなんでしょうけど。


234:デフォルトの名無しさん
08/02/03 00:18:28
どうせ次のC#までまた2年ぐらいあるんだろうしなぁ・・・
F#製品に使うことにするノシ

235:デフォルトの名無しさん
08/02/03 16:13:36
OCamlとか知らんでいきなり#lightでやるの危険だな
letに宣言と式があるなんて知らんかったし、do,doneとかもかなり混乱する
Web上だとそういう初歩の情報ないし。
OCaml入門は読むべしだ。互換性とか適当だけど。
Expert F#は割とわかりやすかった

236:デフォルトの名無しさん
08/02/08 00:45:43
ひゃー

237:デフォルトの名無しさん
08/02/08 00:49:55
F#の日本語本うp

238:名無しさん♯
08/02/24 01:19:50
F#でMapReduceもどきを作ってみますた。(「もどき」なのは、sequentialにしか動かないから。w)
C# LINQに比べると、やっぱり圧倒的に記述しやすいわ。

#light

open System
open Seq

let ap_snd f (a, b) = (a, f b)

// MapReduce

let map_reduce m r =
 map_concat m
 >> groupBy fst
 >> orderBy fst
 >> map (ap_snd (map snd) >> r)

239:名無しさん♯
08/02/24 01:20:36

// word count demo

let mapper (_, v : string) =
 v.Split [| ' '; ','; '.'; '!' |]
 |> filter (not << String.IsNullOrEmpty)
 |> map (fun s -> (s.ToLower(), 1))

let reducer = ap_snd (fold1 (+))

let data =
 [ "This is a pen.";
  "Hello, World!";
  "All your base are belong to us.";
  "My name is nanashi." ]

let _ =
 mapi (fun i s -> (i, s)) data
 |> map_reduce mapper reducer
 |> iter (fun (k, v) -> Console.WriteLine("{0}\t{1}", k, v))

240:名無しさん♯
08/02/24 12:44:20
C#版も置いておきまつ。クエリーの部分だけはきれいなんですが・・・。(´・ω・`)

using System;
using System.Collections.Generic;
using System.Linq;

// MapReduce

public interface IMapper<K1, V1, K2, V2> {

  IEnumerable<KeyValuePair<K2, V2>> Map(KeyValuePair<K1, V1> p);
}

public interface IReducer<K2, V2, K3, V3> {

  KeyValuePair<K3, V3> Reduce(KeyValuePair<K2, IEnumerable<V2>> p);
}

public class MapReduceJob<K1, V1, K2, V2, K3, V3> {

  Func<KeyValuePair<K1, V1>, IEnumerable<KeyValuePair<K2, V2>>> mapper;
  Func<KeyValuePair<K2, IEnumerable<V2>>, KeyValuePair<K3, V3>> reducer;

  public MapReduceJob(IMapper<K1, V1, K2, V2> mapper, IReducer<K2, V2, K3, V3> reducer) {
    this.mapper = mapper.Map;
    this.reducer = reducer.Reduce;
  }

241:名無しさん♯
08/02/24 12:55:01
あれ?数分間書き込めなかった・・・。(´・ω・`)

  public IEnumerable<KeyValuePair<K3, V3>> Execute(IEnumerable<KeyValuePair<K1, V1>> data) {
    return from d in data
        from p in mapper(d)
        group p.Value by p.Key into g
        orderby g.Key
        select reducer(new KeyValuePair<K2, IEnumerable<V2>>(g.Key, g));
  }
}

// word count

class WCMapper : IMapper<int, string, string, int> {

  public IEnumerable<KeyValuePair<string, int>> Map(KeyValuePair<int, string> p) {
    return from s in p.Value.Split(' ', ',', '.', '!')
        where !String.IsNullOrEmpty(s)
        select new KeyValuePair<string, int>(s.ToLower(), 1);
  }
}

class WCReducer : IReducer<string, int, string, int> {

  public KeyValuePair<string, int> Reduce(KeyValuePair<string, IEnumerable<int>> p) {
    return new KeyValuePair<string, int>(p.Key, p.Value.Sum());
  }
}

242:名無しさん♯
08/02/24 12:55:35

static class Test {

  static string[] data = {
    "This is a pen.",
    "Hello, World!",
    "All your base are belong to us.",
    "My name is nanashi."
  };

  static void Main() {
    var d = data.Select((s, i) => new KeyValuePair<int, string>(i, s));

    var job = new MapReduceJob<int, string, string, int, string, int>(new WCMapper(), new WCReducer());

    foreach (var p in job.Execute(d)) {
      Console.WriteLine("{0}\t{1}", p.Key, p.Value);
    }
  }
}

243:名無しさん♯
08/02/24 13:37:52
Map/Reduce = Select/Aggregate だと今まで勘違いしてたけど、

 Map -> SelectじゃなくてSelectMany(generator的な操作)
 Reduce -> 確かにAggregateの操作だけど、厳密にはSelectの中で(selectorとして)実行されるAggregate

だったのね。実際に書いてみないとなかなか気づけんわ。(´・ω・`)

244:名無しさん♯
08/02/24 13:48:26
ついでにネタ振り。

末尾再帰のスタイルはどちらがお好み?

#light

// val sum : int list -> int

let sum1 l =
 let rec sum' l v =
  match l with
  | [] -> v
  | h::t -> sum' t (v + h)
 sum' l 0

let sum2 =
 let rec sum' v = function
  | [] -> v
  | h::t -> sum' (v + h) t
 sum' 0

要は、sum' の引数の順番の問題なのですが・・・。

245:デフォルトの名無しさん
08/02/24 14:32:14
僕は末尾再帰用の追加の引数は最後に置くなぁ
もともと引数は「入力、出力」の順で書いてたので。
末尾再帰は局所定義にすることがほとんどで
部分適用をしないから、それでもいいかなと。

246:名無しさん♯
08/02/24 16:11:10
おお、即日レスがつくとは・・・。(つД`)

>>245
> もともと引数は「入力、出力」の順で書いてたので。

確かにそうですね・・・。

sum2の方は一見ムダがないですけど、意味的にはちょっと無理やりなのかもしれませんね・・・。(´・ω・`)

247:デフォルトの名無しさん
08/02/24 19:26:50
F#がNTPに対応すれば問題なし。

248:名無しさん♯
08/02/25 14:49:13
Haskellにも移植してみますた。

import Data.Char
import Data.List hiding (groupBy)

-- MapReduce

mapReduce :: (Ord k) => (a -> [(k, v)]) -> ((k, [v]) -> b) -> [a] -> [b]
mapReduce m r = map r . orderBy fst . groupBy fst snd . concatMap m

-- word count

mapper :: (Int, String) -> [(String, Int)]
mapper (_, v) = map (\s -> (map toLower s, 1)) . filter (not . null) $ split " ,.!?" v

reducer :: (String, [Int]) -> (String, Int)
reducer (k, v) = (k, sum v)

-- test

data_ = [ "What is this?",
     "This is a pen.",
     "Hello, World!",
     "All your base are belong to us" ]

main = mapM_ p $ mapReduce mapper reducer $ zip (iterate (+1) 0) data_
     where
      p (k, v) = putStrLn $ show k ++ "\t" ++ show v

249:名無しさん♯
08/02/25 14:50:11

-- utils

orderBy :: (Ord k) => (a -> k) -> [a] -> [a]
orderBy fk = sortBy (\x y -> fk x `compare` fk y)

groupBy :: (Eq k) => (a -> k) -> (a -> v) -> [a] -> [(k, [v])]
groupBy _ _ [] = []
groupBy fk fv l = let key = fk $ head l in
          let (g, rest) = partition (\x -> fk x == key) l in
          (key, map fv g) : groupBy fk fv rest

split :: [Char] -> String -> [String]
split sep s = case break (\c -> any (==c) sep) s of
        (v, []) -> [v]
        (v, h:t) -> v : split sep t

250:名無しさん♯
08/02/25 14:52:45
こうやって見ると、F#は.NETの資産を使える分、すごく楽だなあ・・・。(´・ω・`)

251:名無しさん♯
08/02/25 20:37:46
こだわる人はこだわる修正でつ。(´・ω・`)

mapper :: (Int, String) -> [(String, Int)]
mapper = map (\s -> (map toLower s, 1)) . filter (not . null) . split " ,.!?" . snd

252:デフォルトの名無しさん
08/02/26 20:27:17
やはは

253:デフォルトの名無しさん
08/03/07 07:36:31
>>247
NTP対応って何よ?
これか
>米国国家毒性プログラム(べいこくこっかどくせいプログラム、英: National Toxicology Program 、略称: NTP )
とはアメリカ保健社会福祉省が実施している化学物質の毒性研究をまとめ、発がん性物質の分類、試験を行う計画である。

254:デフォルトの名無しさん
08/03/07 08:01:10
面白いと思って書き込んでるのがすごいよな

255:デフォルトの名無しさん
08/03/07 12:12:17
named template(?) parameter

256:デフォルトの名無しさん
08/03/07 14:34:54
むしろ名古屋トヨペット

257:デフォルトの名無しさん
08/03/09 09:58:07
時間同期のプロトコルにきまっとるだろう

258:デフォルトの名無しさん
08/03/20 09:33:17
自分のプログラムの中にF#のインタープリタを組み込みたいんですが可能ですか?
今のプログラムはC#で書いていて、その挙動の一部をカスタマイズできるように
したいのですが、せっかく覚え始めたF#で書ければいいなぁと思っています。

259:デフォルトの名無しさん
08/03/20 18:53:39
キーワードはCodeDOM。
あとは自分で調べろ>>258

260:デフォルトの名無しさん
08/03/28 15:38:29
Visual Studio持ってないとF#って使えないの?
一応インストールはできたんだけど、コマンド打ってくだけ。


261:デフォルトの名無しさん
08/03/28 17:43:18
VSShellがあれば使える。
あと、SharpDevelop 3.0で使えるようになる予定。Beta1で載った。

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)


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

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