[英]How do I use if/then/else or guards in a case statement in Haskell?
[英]In Haskell, how to do a case statement on Dynamic 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"
但它警告重叠模式匹配并且不能正常工作。 它始终是第一个模式而不是正确模式。
case
表达式中->
的左侧是模式 ,而不是表达式 。 模式stringType
将匹配任何内容并将本地名称stringType
绑定到它。 它不会比较平等。
编译器告诉你你的模式intType
和_
永远不会到达; 由于stringType
模式首先出现并匹配任何内容,因此将始终选择其右侧。
正如Claudiu建议的那样,你会想要使用警卫。 像这样的东西应该做的伎俩:
dynFunc d | rep == stringType = ...
| rep == intType = ...
| otherwise = error ...
where rep = dynTypeRep d
如果您有很多可能性,您可能需要考虑制作一个列表并使用lookup
功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.