2012-05-11 33 views
5

Tôi hiện đang cố viết một ví dụ nhỏ cho các hàm số học nguyên thủy.Hiển thị sơ thẩm cho hàm

Mục tiêu ist để tạo danh sách các hàm có thể hiển thị.

Các chức năng rất đơn giản cho chương trình trông như thế:

showOp :: (Int -> Int -> Int) -> String 
    showOp op 
    | op 3 3 == 6 = "plus" 
    | op 3 3 == 0 = "minus" 
    | op 3 3 == 9 = "times" 
    | op 3 3 == 1 = "divide" 
    | otherwise = "undefined" 

Nhưng tôi không thể có được một thể hiện của Hiện for (Int -> Int -> Int). Tôi đã thử nó như thế:

instance Show (Int -> Int -> Int) where 
    show op = show "asdf" 

Nhưng nó không hoạt động. WinHugs chỉ trả lại Lỗi

Syntax error in instance head (variable expected) 

Thậm chí có thể xác định Hiển thị cho các chức năng không? Nếu có, làm thế nào tôi có thể giải quyết vấn đề đó?

Trả lời

6

Không sử dụng WinHugs. Sử dụng GHC.

Thực tế, trong các phiên bản Nền tảng Haskell gần đây, đã có một phiên bản chức năng cho Hiển thị.

Prelude Text.Show.Functions> show (+1) 
"<function>" 
Prelude Text.Show.Functions> show (\x -> x ++ "foo") 
"<function>" 

Bây giờ, trong trường hợp của bạn, tuy nhiên, bạn cần -XFlexibleInstances trên, vì dụ bạn không có dạng (Constructor a1 .. an) nơi a1 .. một là các biến kiểu khác nhau.

Bật tính năng này với {-# LANGUAGE FlexibleInstances #-}

+0

Điều đó nói rằng, không thể xác định 'Hiển thị' để thực sự cung cấp cho bạn thêm chi tiết về hàm. –

+1

Chắc chắn rồi. Nó có thể hiển thị loại (được cho qua Typeable); hoặc nó có thể hiển thị một số đầu vào và đầu ra (như được thực hiện trong QuickCheck). –

+0

... Có. Đuợc. Lấy làm tiếc. Tuy nhiên, không thể hiển thị việc triển khai hoặc tên. –

3

(Đây không phải là một câu trả lời (Don bao gồm nó), nhưng nó là quá dài cho một bình luận)

Mã này có rất nhiều của logic lặp đi lặp lại (đặc biệt op 3 3 == xảy ra rất nhiều), nhưng có để làm cho sạch hơn này: case expressions. Điều này cho phép chúng tôi tính toán op 3 3 một lần và sau đó xử lý các trường hợp khác nhau (giống hệt như khớp mẫu trong định nghĩa hàm).

showOp op = case op 3 3 of 
       6 -> "plus" 
       0 -> "minus" 
       9 -> "times" 
       1 -> "divide" 
       _ -> "undefined" 
1

Bạn cũng có thể sử dụng Hugs.

Bắt đầu ôm bằng hugs -98 +o hoặc runhugs -X-98 +o và sử dụng {-# LANGUAGE FlexibleInstances #-} trong tệp nguồn của bạn.

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