Tôi đã nghiên cứu một số ngôn ngữ lập trình Haskell và bây giờ tôi phát hiện ra rằng có thể gọi hàm Haskell từ các chương trình C. Trong các nghiên cứu Haskell của tôi, tôi đã tạo ra một bộ đếm tần số từ với Haskell và tôi muốn thử gọi hàm đó từ một chương trình C, nhưng tôi không biết cách thực hiện nó. Tôi thấy hai trang web này trên haskell.org:Làm thế nào để chọn đúng loại Haskell C?
Foreign C types (Haskell module)
Mặc dù vậy, tôi là một chút mất mà loại để sử dụng. Chương trình haskell của tôi là một đường ống gồm các chức năng sau:
putStr. unlines. bản đồ testF. sortedTree
nơi các chức năng của riêng tôi
- testF là loại testF :: Hiện a => ([Char], a) -> [Char]
- sortedTree là loại được sắp xếpTree :: (Num a, Ord a) => [Char] -> [([Char], a)]
Tôi khá chắc chắn rằng tôi cần phải chuyển đổi các loại của từng chức năng thành loại C, thay vì chỉ chuyển đổi chức năng gọi đường ống. Các loại chức năng "chính" là
fileFreq :: [Char] -> IO()
Bên cạnh đó tất cả điều này, tôi đang sử dụng một cây nhị phân Haskell, đó không phải là loại khúc dạo đầu.
Dưới đây là toàn bộ mã 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 }
bất cứ ai có thể hướng dẫn cho tôi một chút với điều này?
mát câu hỏi, không may không ai trên ma trận này có vẻ là hữu ích http://asset.soup.io/asset/0750/2820_15d5_960.jpeg Tôi hy vọng nó không phải là xúc phạm, chỉ thú vị trong khi bạn chờ đợi một câu trả lời hợp lý. +1 tất nhiên – stacker
Điều này không rõ ràng với tôi. Bạn có thể rõ ràng về hàm Haskell nào bạn muốn gọi từ C? Giả sử bạn có các ràng buộc làm việc - một người gọi C đơn giản trông như thế nào? –
@stacker: Vô giá: D – Skurmedel