2016年1月3日日曜日

Vb.netからF#を呼び出してみる

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 件のコメント:

コメントを投稿