[英]How to get the type as a String in Haskell?
假設我在模塊 My.Module 中定義了一個類型 MyType。 我想要字符串“My.Module.MyType”(或類似的東西)。 如果我直接輸入字符串,我可能會打錯字,如果模塊或類型名稱發生變化,我想在編譯時知道。
啊,我問的問題似乎有些混亂。 請仔細看問題。 鑒於代碼:
module My.Module
type MyType = Int
data MyType2 = MyConstructor2 Int
main = do
putStrLn $ theMagic MyType
putStrLn $ theMagic MyType2
我想要的輸出是:
My.Module.MyType
My.Module.MyType2
我正在尋找類型名稱,而不是類型定義。 typeOf 會輸出 Int 等,這不是我想要的。
總之,答案是啟用模板haskell並使用'
和''
{-# LANGUAGE TemplateHaskell #-}
main = do
putStrLn $ show 'read
如果您的類型派生Typeable
(ghc 可以自動執行),那么您只需從Data.Typeable
調用typeOf
即可獲得可顯示的表示。
如果你想獲得某些多態函數的類型,Hackage 上的 polytypeable 包允許你這樣做: http ://hackage.haskell.org/packages/archive/polytypeable/0.1.0.0/doc/html/Data-PolyTypeable 。 html
請注意,這是一種由 Oleg 編寫並由 Lennart 打包的瘋狂類型級別的東西。 它有..怪癖。 最明顯的是它不能給你(坦率地說,我也無法想象有什么東西可以)類約束上下文。 所以 show 會被賦予一個類型a -> String
而不是forall a. Show a => a -> String
forall a. Show a => a -> String
。
如果您需要的不止這些,並且滿足於只在編譯時做某些事情,那么使用模板 haskell 直接從 ghc 中提取類型信息是唯一的出路。 特別參見reify
和Info
: http : //hackage.haskell.org/packages/archive/template-haskell/2.5.0.0/doc/html/Language-Haskell-TH.html
你不能將 theMagic 定義為一個函數(因為它需要一個類型參數),但你可以接近。
import Data.Typeable
...
putStrLn $ show $ typeOf (undefined :: MyType)
您可以為此使用Proxy
:
Prelude> import Data.Typeable
Prelude Data.Typeable> show $ typeRep (Proxy :: Proxy [Int])
"[Int]"
標准 Haskell 不支持此類型名稱; 僅適用於deriving Show
函子名稱。 您可以使用Template Haskell將類型名稱作為字符串獲取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.