私はいくつかの Haskell プログラミング言語を勉強しましたが、C プログラムから Haskell 関数を呼び出すことができることを知りました。Haskell の研究中に、Haskell で単語頻度カウンターを作成しました。その関数を C プログラムから呼び出したいのですが、その方法がわかりません。haskell.org で次の 2 つの Web サイトを見つけました。
それにもかかわらず、どのタイプを使用するか少し迷っています。私の haskell プログラムは、次の関数のパイプラインです。
putStr 。線を外します。マップ testF 。並べ替えられたツリー
自分が機能する場所
- testFは testF の型です:: Show a => ([Char],a) -> [Char]
- sortedTreeは sortedTree の型です:: (Num a, Ord a) => [Char] -> [([Char],a)]
パイプラインを呼び出す関数だけを変換するのではなく、各関数の型を C 型に変換する必要があることは確かです。「メイン」関数のタイプは
fileFreq :: [文字] -> IO ()
これらすべてに加えて、プレリュード タイプではない Haskell バイナリ ツリーを使用しています。
Haskell コード全体は次のとおりです。
module WordCounter where
import List
import Char
import Foreign.C.Types
data BTree a = Tip | BNode a (BTree a) (BTree a) deriving Show
insertFreq x Tip = BNode (x,1) Tip Tip
insertFreq x (BNode (q,p) l r) | (map toLower x)==(map toLower q) = BNode (q, p+1) l r
| otherwise = BNode (q,p) l (insertFreq x r)
tlist :: BTree a -> [a]
tlist Tip = []
tlist (BNode x l r) = concat [tlist l, [x], tlist r]
sortedTree x = sortBy (\(x,y) (p,q) -> compare q y) (tlist (foldr insertFreq Tip (words x)))
testF (x, n) = concat (x : ":" : " \t\t\t " : show n : [])
concord = putStr . unlines . map testF . sortedTree
fileFreq filename = do { text <- readFile filename; concord text }
誰でもこれで私を少し案内できますか?