F#を少し使ってみた。関数型言語に共通するのは、副作用の多いGUIが使いにくいところらしい。(F#でイベントを駆使すれば、いろいろ便利ではあるようだけど?)妥協案としてVB.netでGUI(View)部分を作って、副作用なしのロジック部分はF#を使うというのはどうだろうか。
http://ameblo.jp/ns-programming-memo/entry-11241535796.html
を参考にさせった。C#でも、VBでも、可能。vs2015で試した。
①Vb.netで、プロジェクトを作成。
②ソリューションエクスプローラで、新しいプロジェクトとして、F#のライブラリを選択
③Library1.fsで
module Modulex
let x a b = a*b;;
④VBのプロジェクトの参照で、参照の追加で、同じソリューションのフォルダにできている
Library1を追加
⑤vb.netでボタンを貼り付けて
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(Modulex.x(2, 3).ToString)
End Sub
などとしてみたら、うまく動作することが確認できた。
**************
関数であれば
namespace Library1
open System
module FSLib =
let fsFunc=new Func<string,string>(fun s -> s+s)
がF#側にあれば、C#側では
listBox1.Items.Add(Library1.FSLib.fsFunc("test"));
のように呼び出すこともできるようだ。
ただし、F#のライブラリはその都度、コンパイルしないと反映しないようだ。
**************
リストであれば
namespace Library1
open System
open System.Collections.Generic
module FSLib =
let Avg( array : List<float>) =
let list = List.ofSeq(array)
List.average list
をF#側とすれば、C#側では
List<double> myInts = new List<double> { 5, 6, 7.5 };
double avg = Library1.FSLib.Avg(myInts);
textBox2.Text = avg.ToString() ;
のような感じである。
ちょっとした、変換は必須のようである。
*****************
配列などは F#で
let text= File.OpenText( @"c:\test.csv").ReadToEnd().Split([|','|])
で取得した配列を
textBox2.Text = FSLib.text[0];
のようにC#に渡すこともできるようだ。
let xx = [1..3] |> List.toArray
let x2= [1..3]
というF#により
textBox2.Text = FSLib.xx[0].ToString() ;や
textBox2.Text = FSLib.x2[1].ToString();なども可能なようだ
0 件のコメント:
コメントを投稿