Skip to content

Instantly share code, notes, and snippets.

@PhilOwen
Created August 16, 2017 02:08
Show Gist options
  • Save PhilOwen/370c5bfbc5c9c6a6fbe520a6c53e35fa to your computer and use it in GitHub Desktop.
Save PhilOwen/370c5bfbc5c9c6a6fbe520a6c53e35fa to your computer and use it in GitHub Desktop.
Haskellから.NET

Haskellから.NET Frameworkを呼べるそうなので、 System.Numerics.Complexで複素数を計算させてみた。
今回はF#を使ったが、C#でもできるらしい。 (あまり長所は引き出せていない)

F#のインラインでは、($x:double)のようにして Haskellの値を渡せる。 インラインブロックの返り型は明示する。

今のclr-inlineパッケージの実装では、 配列やレコードなど複雑なデータはまだやりとりできないらしい。 プリミティブ型以外は、CLRオブジェクトという形でしかやりとりできず、 Haskellからすればブラックボックスである。 今回は、そのブラックボックスから 複数回に分けて一個ずつプリミティブを取り出した。

また、ドキュメントにはopen宣言が使えると書いているが、 なぜかダメだった。
関数も渡せそうだが、まだよくわからない。 Haskellから.NETを使うとすれば、GUIが便利そうだが、 イベントハンドラをどうすればよいのか…。 必要ならまた掘ってみる。

Reference

name: inline-fs
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable inline-fs-exe
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, clr-inline
default-language: Haskell2010
default-extensions: DataKinds
, QuasiQuotes
import Clr.Inline
rotate :: (Double, Double) -> Double -> IO (Double, Double)
rotate (x, y) t = do
rotated <- [fsharp| System.Numerics.Complex {
let org = new System.Numerics.Complex(($x:double), ($y:double))
let r = new System.Numerics.Complex(cos ($t:double), sin $t )
org * r
} |]
x' <- [fsharp| double { ($rotated:System.Numerics.Complex).Real } |]
y' <- [fsharp| double { ($rotated:System.Numerics.Complex).Imaginary } |]
return (x', y')
main = do
startClr
c1 <- rotate (2, 0) (pi/4)
c2 <- rotate c1 (pi/4)
print [c1, c2]
resolver: lts-9.0
packages:
- .
extra-deps: []
flags: {}
extra-package-dbs: []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment