[ANN][Haskell] Вызов .Net функций из Хаскеля
От: Andir Россия
Дата: 15.01.09 15:18
Оценка: 10 (1)
Добрый день, коллеги!

В Haskell-сafe промелькнул анонс мини-библиотечки, которая позволяет из Хаскеля звать .Net через рефлекшен.
Как я понял, технически реализовано через вызовы .Net COM-объекта, который выставляет наружу интерфейс для вызова дотнетовских функций через рефлекшен.

Из примеров:
module MD5 where

import NET
import Data.Word
import Numeric

calcMD5FromString :: String -> IO String
calcMD5FromString str = do
   md  <- invokeStatic "System.Security.Cryptography.MD5" "Create" ()
   fi  <- getFieldStatic "System.Text.Encoding" "ASCII" ()
   bs  <- fi  # invoke "GetBytes" str
   vec <- md  # invoke "ComputeHash" (bs :: Vector Word8)
   res <- vec # bytesToString
   let resStr = foldr (showHex) "" res
   return resStr

bytesToString :: Vector Word8 -> IO [Word8]
bytesToString vec = do
   len  <- vec # getField "Length" ()
   mapM (\ i -> do
           x <- vec # invoke "GetValue" (i::Int)
       return (x::Word8))
        [0..((len::Int)-1)]


суть в функциях invoke, invokeStatic.

Также присутствует утилитка, которая занимается генерацией типов и функций, которые оборачивают вызовы через рефлекшен.
Примерно так:
module NET.System.Uri where
-- ...

data Uri_ a
type Uri a = NET.System.Object.Object (Uri_ a)

get_AbsolutePath :: Uri obj -> IO (String)
get_AbsolutePath = invoke "get_AbsolutePath" ()


http://haskell.forkio.com/dotnet

C Уважением, Andir!
using( RSDN@Home 1.2.0 alpha 4 rev. 1135 ) { /* Работаем */ }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.