我想在Haskell中做一個簡單的Scheme解釋器。作爲其中的一部分,我正在實現一些原始運算符,如數字,字符串?等Haskell函數需要一個類型和值,並檢查值是否具有該類型
我有這樣的代碼:
isNumber :: [LispVal] -> LispVal
isNumber ([Number n]) = Bool True
isNumber _ = Bool False
isString :: [LispVal] -> LispVal
isString ([String n]) = Bool True
isString _ = Bool False
而我想是一樣的東西
isType :: ?? -> [LispVal] -> LispVal
isType (typeName [typeName n]) = Bool True
isType _ = Bool False
換句話說,我想通過創建ISNUMBER相當於說「isType號碼」。這可能以某種方式嗎?我努力在Google中找到類似的東西,也許是因爲我不知道該怎麼稱呼這種情況。
你可能應該說「構造函數」而不是「類型」,因爲正如它所寫,這個問題在Haskell的上下文中甚至沒有意義。您使用Haskell構造函數來表示Lisp類型,但這與Haskell的結果無關。 – ehird
Data.Typeable可能值得一看,但似乎並不需要動態檢查。 – ExternalReality
請參閱此處[模板Haskell解決方案](http://stackoverflow.com/questions/7213974/how-to-examine-a-quoted-data-constructor-name-in-template-haskell/7214422#7214422)。有了這個,你可以做'isNumber = $(isA'Number)' – hammar