2011-11-17 16 views
7

將字符串轉換爲一個類型構造有誰知道是否有在Haskell一個函數,它確實是這樣的:在Haskell

"Int" -> Int 

"String" -> String 

"Bool" -> Bool 

即。它需要一個類型構造函數名稱的字符串表示,並將其轉換爲實際的類型構造函數,無論是在表達式中還是在模式中。

編輯: 我的總體目標是簡化這樣的:

transExp (Add exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [IAdd] 

transExp (Sub exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [ISub] 

成一個單一的模式匹配,所以基本上轉換添加或子爲一個字符串,添加一個「I」到前面,並轉換它回到了一個類型。

+3

這甚至可能嗎?這些類型不是編譯時概念嗎?你正在尋找什麼類型的功能? –

+0

我不知道這是否可能,我想它會有類型字符串 - > a,但我真的不知道... – Jack

+0

然後看看模板haskell。另外'IAdd'不是一個類型,而是一個類型構造函數 - 這是誤導性的。 – nponeccop

回答

10

有一種更好的方法來這裏重構你的代碼沒有任何模板哈斯克爾或反射有心計只需加入您的AddSub箱子到一個:

data BinOp = Add | Sub | ... 

data Expr = ... 
      | BinOp BinOp Expr Expr 
      | ... 

transExp (BinOp op exp1 exp2) vars 
    = transExp exp1 vars ++ transExp exp2 vars ++ [transOp op] 
... 

transOp Add = IAdd 
transOp Sub = ISub 

這樣,我們所使用的數據類型直接表達二元運算符相關的事實,因此具有相似的翻譯。如果您想在某處添加特殊情況,您仍然可以在BinOp Add exp1 exp2上進行模式匹配。

+0

精彩的解決方案 - 比我想象的要少得多。非常感謝你:) – Jack

+0

這是更優雅。感謝您的提醒,它有助於縮小範圍並擴大視野。 –

2

在哪種情況下?有模板哈斯克爾和Data.Typeable,但對於一個實際有用的答案,你需要提供更多的細節。

0

好吧,這是問題所在。

"String" -> String 

這是胡言亂語哈斯克爾土地,因爲"String"是一個值,但String是一種類型。所以你可以試試這個:

String -> a 

這不符合你的要求。你應該學習如何閱讀類型簽名,因爲如果你不能讀取類型簽名,你將會在Haskell中被嚴重障礙。上面的類型意味着,「給我一個字符串,我可以給你一個你請求的任何類型的值。」這個簽名的前奏中有一個功能,叫做error,這不是你想要的。

這聽起來像你想沿着這些路線的東西:

String -> TypeRep 

對不起,沒有這樣的功能。 TypeRep沒有實例化Read類。

你在做什麼其實想在這裏做?如果您告訴我們您實際要做的事情,我們可以幫助您解決這個問題,而不是試圖解決這個問題。

+0

他不是在談論類型名稱,而是在談論類型構造函數。他只是想從字符串中產生一些值和模式匹配,以避免樣板化。 – nponeccop

+2

@nponeccop:在問題發生變化後,回答問題並不公平。這項關於建設者的業務是全新的。 –

0

你不能這樣做,因爲字符串是運行時數據,類型必須在編譯時完全解析。你也許可以做你的榜樣,最好是一個輔助功能,以消除一些重複的:

helper exp1 exp2 vars op = transExp exp1 vars ++ transExp exp2 vars ++ [op] 
transExp (Add exp1 exp2) vars = helper exp1 exp2 vars IAdd 
transExp (Sub exp1 exp2) vars = helper exp1 exp2 vars ISub 

但這實際上可能不是從長遠來看是非常有用的,這取決於你有多少病例有。

通常,模式匹配是針對類型結構運行的,因此必須在編譯類型中針對具體類型構造函數進行拼寫。這是您必須爲具有非常穩定的靜態類型系統而付出的代價。

+0

他可以使用模板Haskell代碼在編譯時運行 – nponeccop

+0

確實他可以,但爲了他的目的,他說這對我來說似乎有點矯枉過正。 –

+0

我認爲他必須知道所有可能的解決方案。對他來說,這是一個很好的機會來了解他能做什麼。 @hammar解決方案也很棒。 – nponeccop