Haskell
C#
14
どのような問題がありますか?

この記事は最終更新日から5年以上が経過しています。

投稿日

更新日

C#からHaskellの関数を呼ぶ

stackoverflowのリンク先そのまんまなんだけどひとつ詰まったのでメモ
http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp

動作確認環境

  • Windows 7 64 bit
  • GHC 7.8.3
  • Visual Studio Express 2013 for Windows Desktop

Haskellコード

Fibonacci.hs
{-# LANGUAGE ForeignFunctionInterface #-}

-- http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp

module Fibonacci () where

import Data.Word
import Foreign.C.Types

fibs :: [Word32]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

fibonacci :: Word8 -> Word32
fibonacci n =
  if n > 47
    then 0
    else fibs !! (fromIntegral n)

c_fibonacci :: CUChar -> CUInt
c_fibonacci (CUChar n) = CUInt (fibonacci n)

foreign export ccall c_fibonacci :: CUChar -> CUInt

Haskellコードのビルド

ghc --make -shared Fibonacci.hs
HSdll.dllができる

C#コード

VisualStudioのコンソールアプリケーションプロジェクト

Program.cs
using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    // http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp
    public sealed class Fibonacci : IDisposable
    {
        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void hs_init(IntPtr argc, IntPtr argv);

        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void hs_exit();

        [DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern UInt32 c_fibonacci(byte i);

        public Fibonacci()
        {
            Console.WriteLine("Initialising DLL...");
            hs_init(IntPtr.Zero, IntPtr.Zero);
        }

        public void Dispose()
        {
            Console.WriteLine("Shutting down DLL...");
            hs_exit();
        }

        public UInt32 fibonacci(byte i)
        {
            Console.WriteLine(string.Format("Calling c_fibonacci({0})...", i));
            var result = c_fibonacci(i);
            Console.WriteLine(string.Format("Result = {0}", result));
            return result;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            using(var fib = new Fibonacci())
            {
                fib.fibonacci(10);
            }

            Console.ReadLine();
        }
    }
}

C#コードのビルド

プロジェクトのプロパティからプラットフォームターゲットをAny CPUからx64に変更してビルド(使ってるOSに合わせる?)
Haskell関係なくてC#でDLLを扱う際の基本知識なんだろうけどここがわからず詰まった(ノ∀`)

キャプチャ.PNG

実行

HSdll.dllをC#の.exeがあるフォルダにコピーして.exeを実行する

キャプチャ2.PNG

成功ヽ(^。^)ノ

Haskellのみでなにか作るのはきついんだけどこの方法でUIをC#/WPFで作って、ロジックをHaskellで記述するものが作れそう。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
maaz118
この記事は以下の記事からリンクされています
A_kirisakiPythonからHaskell関数を呼ぶからリンク

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
新人プログラマ応援 - みんなで新人を育てよう!
~
データに関する記事を書こう!
~
14
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー