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)
但它警告重叠模式匹配并且不能正常工作.它始终是第一个模式而不是正确模式.
的左手侧->在一个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功能.
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |