【发布时间】:2011-06-22 22:31:17
【问题描述】:
我研究了一些 Haskell 编程语言,现在我发现可以从 C 程序中调用 Haskell 函数。在我学习 Haskell 期间,我用 Haskell 创建了一个词频计数器,我想尝试从 C 程序中调用该函数,但我不知道该怎么做。我在 haskell.org 上找到了这两个网站:
Foreign C types (Haskell module)
尽管如此,我还是有点不知道要使用哪种类型。我的 haskell 程序是以下功能的管道:
putStr 。取消线。映射 testF 。排序树
我自己的功能在哪里
- testF 是 testF :: Show a => ([Char],a) -> [Char] 的类型
- sortedTree 是 sortedTree :: (Num a, Ord a) => [Char] -> [([Char],a)] 的类型
我很确定我需要将每个函数的类型转换为 C 类型,而不是只转换调用管道的函数。 “main”函数的类型是
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 }
谁能指导我一下?
【问题讨论】:
-
很酷的问题,不幸的是,这个矩阵上似乎没有人有帮助asset.soup.io/asset/0750/2820_15d5_960.jpeg 我希望它没有冒犯,只是在您等待合理答案时很有趣。 +1 当然
-
我不清楚。您能否明确说明您希望从 C 调用哪个 Haskell 函数?假设您的绑定正常工作 - 一个简单的 C 调用程序是什么样的?
-
@TomMD:我正在尝试从 C 程序调用 fileFreq 函数。简单的 C 调用程序看起来只是一个简单的 C 程序,其中只有 Haskell 函数调用。