IO () dynFunc d =-6ren">
gpt4 book ai didi

haskell - 在 Haskell 中,如何在 Dynamic TypeRef 上做一个 case 语句

转载 作者:行者123 更新时间:2023-12-02 06:41:24 24 4
gpt4 key购买 nike

我尝试了以下方法:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com