Tôi đang cố gắng tạo một trình thông dịch Scheme đơn giản trong Haskell. Là một phần của điều này, tôi đang thực hiện một số toán tử nguyên thủy như số ?, chuỗi? vvChức năng Haskell lấy một loại và một giá trị và kiểm tra nếu giá trị có loại
tôi có mã như thế này:
isNumber :: [LispVal] -> LispVal
isNumber ([Number n]) = Bool True
isNumber _ = Bool False
isString :: [LispVal] -> LispVal
isString ([String n]) = Bool True
isString _ = Bool False
Và những gì tôi muốn là một cái gì đó giống như
isType :: ?? -> [LispVal] -> LispVal
isType (typeName [typeName n]) = Bool True
isType _ = Bool False
Nói cách khác, tôi muốn tạo tương đương với ISNUMBER bởi nói "isType Number". Điều này có thể bằng cách nào đó? Tôi đang đấu tranh để tìm thấy bất cứ điều gì tương tự trong Google, có thể bởi vì tôi không biết những gì để gọi tình hình.
Bạn có lẽ nên nói "hàm tạo" thay vì "loại", vì nó được viết, câu hỏi này thậm chí không thực sự có ý nghĩa trong ngữ cảnh của Haskell. Bạn đang đại diện cho các kiểu Lisp với các hàm tạo Haskell, nhưng điều đó không liên quan trực tiếp đến câu hỏi Haskell mà nó dẫn đến. – ehird
Data.Typeable có thể đáng xem, nhưng nó không xuất hiện mà bạn cần kiểm tra động tại đây. – ExternalReality
Xem tại đây cho [giải pháp mẫu Haskell] (http://stackoverflow.com/questions/7213974/how-to-examine-a-quoted-data-constructor-name-in-template-haskell/7214422#7214422). Với điều này bạn có thể làm 'isNumber = $ (isA 'Number)' – hammar