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

标签 haskell dynamic types 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"

但它警告重叠模式匹配并且不能正常工作。它总是转到第一个模式而不是正确的模式。

最佳答案

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/

相关文章:

haskell - 观察类型理论中的模式匹配

haskell - 一个环境如何恰好是一个部分应用函数,甚至是一个 hom 仿函数?

斯卡拉: "No manifest available for type T"

typescript :如何创建类型的副本但更改属性类型

python - mypy 找不到模块 'dropbox'

security - 在没有 GeneralizedNewtypeDeriving 的情况下破坏 Data.Set 完整性

haskell - Haskell 迷你语言

使用realloc扩展大小的C动态数组错误: Invalid next-size

sql - 动态 SQL - 从 C 程序打印 DATE

jquery 处理程序无法使用动态添加的 id