在Haskell中,如何在Dynamic TypeRef上执行case语句

men*_*ics 2 haskell types dynamic pattern-matching case-statement

我尝试了以下方法:

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"
Run Code Online (Sandbox Code Playgroud)

但它警告重叠模式匹配并且不能正常工作.它始终是第一个模式而不是正确模式.

ham*_*mar 9

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

编译器告诉你,你的模式intType,并_永远不会到达; 因为stringType模式首先出现并匹配任何东西,所以它的右侧将始终被选中.

正如Claudiu建议的那样,你会想要使用警卫.像这样的东西应该做的伎俩:

dynFunc d | rep == stringType = ...
          | rep == intType    = ...
          | otherwise         = error ...
          where rep = dynTypeRep d
Run Code Online (Sandbox Code Playgroud)

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