【发布时间】: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'}
但我也收到类型不匹配错误。
【问题讨论】: