Как выбрать правильный тип Haskell C?

Я изучил некоторый язык программирования Haskell и теперь обнаружил, что можно вызывать функции Haskell из программ на языке C. Во время изучения Haskell я создал счетчик частоты слов с помощью Haskell, и я хотел бы попытаться вызвать эту функцию из программы на C, но я не знаю, как это сделать. Я нашел эти два веб-сайта на haskell.org:

Вызов Haskell из C

Внешние типы C (модуль Haskell)

Несмотря на это, я немного потерял, какие типы использовать. Мои программы haskell представляют собой конвейер из следующих функций:

putStr. без строк. карта testF. sortedTree

, где мои собственные функции

  • testF являются типом testF :: Show a => ([Char], a) -> [Char]
  • sortedTree являются типом sortedTree :: (Num a, Ord a) => [Char] -> [([Char], a)]

I ' m совершенно уверен, что мне нужно преобразовать типы каждой функции в типы 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 }

Может ли кто-нибудь немного помочь мне с этим?

10
задан sclv 7 February 2011 в 18:45
поделиться