簡體   English   中英

如何在 Haskell 中將類型作為字符串獲取?

[英]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 中提取類型信息是唯一的出路。 特別參見reifyInfohttp : //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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM