2

我尝试了以下方法:

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"

但它会警告重叠模式匹配并且无法正常工作。它总是转到第一个模式而不是正确的模式。

4

1 回答 1

9

->表达式中的左侧case模式,而不是表达式。该模式stringType将匹配任何内容并将本地名称绑定stringType到它。它不会比较平等。

编译器告诉你你的模式intType永远_不会达到;由于stringType模式首先出现并匹配任何内容,因此将始终选择其右侧。

正如 Claudiu 建议的那样,您将需要使用警卫。这样的事情应该可以解决问题:

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

如果您有很多可能性,您可能需要考虑制作一个列表并使用该lookup功能。

于 2011-09-10T00:34:04.327 回答