Я изучил некоторый язык программирования Haskell, и теперь я узнал, что можно вызвать функции Haskell из программ C. Во время моих исследований Haskell я создал счетчик частоты слов с Haskell, и я хотел бы попытаться вызвать эту функцию из программы C, но я не знаю, как это сделать. Я нашел эти два сайта на haskell.org:
Внешние типы C (модуль Haskell)
Несмотря на это, я немного потерял, какие типы использовать. Мои программы haskell являются конвейером следующих функций:
putStr. unlines. карта testF. sortedTree
где мои собственные функции
- testF - тип testF:: Показать a = > ([Char], a) → [Char]
- sortedTree - это тип sortedTree:: (Num a, Ord a) = > [Char] → [([Char], a)]
Я совершенно уверен, что мне нужно преобразовать типы каждой функции в типы C, вместо того, чтобы преобразовывать только функцию, которая вызывает конвейер. Тип "основной" функции -
fileFreq:: [ Char] → 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 }
Может ли кто-нибудь мне немного поучаствовать?