2011-09-10 51 views
2

我試過如下:在Haskell,如何做一個case語句動態TypeRef

intType = typeOf (5::Int) 
stringType = typeOf "s" 

dynFunc :: Dynamic -> IO() 
dynFunc d = 
    case dynTypeRep d of 
    stringType -> polyFunc ((fromDyn d "") :: String) 
    intType -> polyFunc ((fromDyn d 0) :: Int) 
    _  -> error "Could not coerce dynamic value" 

但是,該報告的重疊模式匹配和不工作的權利。它總是以第一種模式代替正確的模式。

回答

9

case表達式中的->的左側是patterns, not expressions。模式stringType將匹配任何東西並將本地名稱stringType綁定到它。它會不是比較平等。

編譯器告訴你,你的模式intType_將永遠不會到達;由於stringType模式首先匹配任何東西,它的右側將始終被選中。

正如Claudiu建議的那樣,您需要改用防護裝置。這樣的事情應該做的伎倆:

dynFunc d | rep == stringType = ... 
      | rep == intType = ... 
      | otherwise   = error ... 
      where rep = dynTypeRep d 

如果你有很多的可能性,你可能要考慮制定一個列表,並使用lookup功能。