我尝试了以下方法:
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"
但它警告重叠模式匹配并且不能正常工作。它总是转到第一个模式而不是正确的模式。
最佳答案
case
表达式中 ->
的左侧是 patterns, not expressions .模式 stringType
将匹配 anything 并将本地名称 stringType
绑定(bind)到它。它不会比较是否相等。
编译器告诉你,你的模式 intType
和 _
永远不会被访问;由于 stringType
模式首先出现并匹配任何内容,因此始终会选择其右侧。
正如 Claudiu 所建议的,您需要改用守卫。像这样的东西应该可以解决问题:
dynFunc d | rep == stringType = ...
| rep == intType = ...
| otherwise = error ...
where rep = dynTypeRep d
如果您有多种可能性,您可能需要考虑列一个 list 并使用 lookup
功能。
关于haskell - 在 Haskell 中,如何在 Dynamic TypeRef 上做一个 case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368684/