【问题标题】:Nim : How to constrain an existing typeNim:如何约束现有类型
【发布时间】:2022-06-30 23:36:42
【问题描述】:

我有一个关于类型定义的问题。

我想限制现有类型以强制执行某些附加标准。 例如,我想为 DNA 字符串构造一个类型。

可以将 DNA 链视为任意长字符串,其中仅包含字符“A”、“C”、“G”、“T”(核苷酸)。 同样,我会将 RNA 字符串定义为仅包含字符 'A'、'C'、'G'、'U' 的字符串。

一个RNA字符串可以分解成密码子,即四个核苷酸('A'、'C'、'G'、'U')中只有三个字符的字符串。 我可以创建一个密码子类型,它会自动检查(例如在初始化时或类型转换后),字符串是否长度为 3 并且不包含除有效字符之外的任何其他字符吗?

我尝试使用概念类型:

var
  NucleotideSet: set[char] = {'A','C','G','U'}

type
  Nucleotide {.explain.} = concept var a
    a is char
    a in {'A','C','G','U'}

  RnaCodon = seq[Nucleotide]

但这个实验性功能不会强制现有类型,它只检查一个类型是否验证了某些属性,但我可能弄错了。

我想做的是操作 RNA 字符串,而不必手动检查每个字符是否确实是核苷酸。

使用我上面代码中的定义,以下失败:

echo 'A' is Nucleotide

我得到一个类型不匹配:''A'' 是 char 但预期是核苷酸。 在这个例子中我做错了什么,我该如何修复它来定义一个 RNAstring 和一个密码子? 我现在的猜测是,在概念类型中,a 不是类型而是变量,我可能需要编写类似的内容:

type
  Nucleotide {.explain.} = concept var a, type T
    a is T
    T is char
    a in {'A','C','G','U'}

但我也收到类型不匹配错误。

【问题讨论】:

    标签: types typeerror nim-lang


    【解决方案1】:

    据您解释,您遇到的唯一问题是您希望拥有一种变量,前提是您确定只保留某个值。我会使用普通字符串作为a distinct type。文档中的 avoiding sql injection attacks 部分解释了这句话的含义:

    1. 为 DNA 和 RNA 链创建不同的字符串。
    2. 创建一个验证/解析函数,任何输入转换为 DNA 或 RNA 不同的字符串。
    3. 对于每个输入字符串,将输入传递给那些转换函数。如果它们是有效的 DNA/RNA,您的函数将返回转换为不同类型的字符串,否则将丢弃输入和/或生成错误。
    4. 从那时起,其他代码仅使用 distinct 类型,因此您不能在那里传递未经验证的字符串,并确信发送到这些 proc 的数据已经过验证。

    当您使用不同类型时,您甚至不需要检查不同类型的某个元素是否为核苷酸,因为您的输入验证/转换过程已经处理过一次。

    【讨论】:

      【解决方案2】:

      概念不适用于运行时(甚至在 VM 中运行)“方面”。它绑定到每种类型(在“概念诊断”之前查看实验手册的this 部分的最后一段)例如,仅绑定特定长度的 seq 是不可能的,因为不同的 seq长度不是不同的类型。角色也一样。

      您必须做杂技并将字符静态指定为用户创建类型中的通用参数,类似于第一个示例here 中的AnyMatrix 概念。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 2017-11-28
        相关资源
        最近更新 更多