【问题标题】:Type Checking failed when using Dependent Pair使用依赖对时类型检查失败
【发布时间】:2018-01-08 16:17:56
【问题描述】:

我写下这个:

data IsTag : String -> Type where
    NumIsTag : IsTag "num"
    StrIsTag : IsTag "str"

arr1 : List (tag : String ** (IsTag tag, (case tag of "num" => Int; "str" => String)))
arr1 = [("num" ** (NumIsTag, 1)), ("str" ** (StrIsTag, "hello"))]

并得到以下使用错误消息:

When checking right hand side of arr1 with expected type
        List (tag : String **
              (IsTag tag, case tag of   "num" => Int "str" => String))

When checking argument b to constructor Builtins.MkPair:
        case "num" of
          "num" => Int
          "str" => String is not a numeric type

但我不明白,为什么case "num" of "num" => Int; "str" => String 不是数字类型?不是等于Int吗?

【问题讨论】:

    标签: idris dependent-type


    【解决方案1】:

    不是,因为 Idris 在类型检查期间不会减少部分(非全部)函数。

    如果您的字符串不等于 "num" / "str" 的情况下您有一个很好的默认类型,那么您可以有这样的事情:

    total
    tagToType : String -> Type
    tagToType "num" = Int
    tagToType "str" = String
    tagToType _ = ?defaultType
    
    arr1 : List (tag : String ** (IsTag tag, tagToType tag))
    arr1 = [("num" ** (NumIsTag, 1)), ("str" ** (StrIsTag, "hello"))]
    

    另一种选择是这样定义它:

    total
    tagToType : IsTag s -> Type
    tagToType NumIsTag = Int
    tagToType StrIsTag = String
    
    arr1 : List (tag : String ** istag : IsTag tag ** tagToType istag)
    arr1 = [("num" ** NumIsTag ** 1), ("str" ** StrIsTag ** "hello")]
    

    【讨论】:

    • 但我已经告诉伊德里斯“str”是一个标签,并证明了这一点。我应该怎么做才能让 Idris 相信这个标签一定是一个标签?
    • 如果我不需要 defaultType,并且想向 idris 证明标签必须是 "num" 和 "str" 之一怎么办?
    • @luochen1990 我更新了答案。您正在寻找这种解决方案吗?
    • 谢谢,但是如果我想隐藏多余的部分怎么办?
    • 我想你回答了我原来的问题,我不应该将它编辑到另一个问题,我会为那个问题打开一个新问题,谢谢! @Anton Trunov
    猜你喜欢
    • 2011-12-12
    • 2023-03-20
    • 1970-01-01
    • 2020-10-07
    • 2015-10-11
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多