2014-10-22 21 views
6

Tôi cần thực hiện một số khối nhỏ chương trình của mình hoạt động khác nhau trên các nền tảng khác nhau. Có vẻ như GHC không giỏi biên dịch chéo, vì vậy tôi đang lập kế hoạch biên dịch cùng một mã trên Linux và Windows.Phát triển đa nền tảng trong Haskell

Cách được khuyến nghị để thực hiện việc này là gì? Tôi có phải viết nhiều phiên bản của một mô-đun, hoặc có một cái gì đó giống như chỉ thị tiền xử lý mà tôi có thể đưa vào mã của tôi để có điều kiện biên dịch một khối mã hay mã khác?

P.S. Tôi đang sử dụng GHC và Cabal để quản lý.

Trả lời

6

GHC hỗ trợ running your code through a C preprocessor. Nó không phải là một giải pháp rất Haskelly, nhưng nó là những gì được sử dụng trong thực tế khi cần thiết.

EDIT: Zeta chỉ ra có một tùy chọn ngôn ngữ cho mỗi tập tin này (mà tôi thực sự biết nhưng nó không được đề cập trong liên kết ở trên):

{-# LANGUAGE CPP #-} 

Đối với Cabal, bạn có thể use the extensions field. Để trích dẫn, vì nó đề cập đến sử dụng trường hợp này rất:

phần mở rộng: danh sách nhận dạng

Một danh sách các phần mở rộng Haskell sử dụng bởi tất cả các mô-đun. Các tên mở rộng là các hàm tạo của kiểu mở rộng. Điều này xác định các tùy chọn trình biên dịch tương ứng. Cụ thể, CPP quy định rằng các tệp nguồn Haskell phải được xử lý trước bằng bộ tiền xử lý C.

Extensions sử dụng chỉ bằng một mô-đun có thể được xác định bằng cách đặt một pragma NGÔN NGỮ trong file nguồn bị ảnh hưởng, ví dụ: {- # NGÔN NGỮ CPP, MultiParamTypeClasses # -}

+4

Trong khi GHC có '-cpp', không phải là '{- # LANGUAGE CPP # -}' trên cơ sở từng tệp được ưa thích? – Zeta

Các vấn đề liên quan