如何解决如何在茱莉亚做一个新的类型?
我写了一个用于翻译RNA密码子的haskell代码,如下所示:
data Base = U | C | A | G
data Amino = Phe | Lue | Ile | Met | Val | Ser | Pro | Thr | Ala |
Tyr | Stop | His | Gln | Asn | Lys | Asp | Glu | Cys | Trp | Arg | Gly deriving Show
codon :: Base -> Base -> Base -> Amino
parse :: String -> [Base]
parse = map go where
go 'U' = U
go 'A' = A
go 'C' = C
go 'G' = G
convert :: [Base] -> [Amino]
convert [] = []
convert (x1:x2:x3:xs) = codon x1 x2 x3 : convert xs
convert _ = undefined
main = do
input <- getLine
let x = show . convert . parse $ input
putStrLn x
codon U U U = Phe
codon U U C = Phe
codon U U A = Lue
codon U U G = Lue
codon C U U = Lue
我想这样编写julia代码。为了创建Base
或Amino
这样的新类型,我在julia文档中发现了抽象类型,但找不到如何创建新类型。
如何定义诸如Base
和U
,C
,A
,G
之类的新类型?
解决方法
是的。我既不了解基因组学也不了解Haskell,但您应该喜欢此代码。
@enum Baze::Int8 U C A G
@enum Amino::Int8 Phe Lue Ile Met Val Ser Pro Thr Ala Tyr Stop His Gln Asn Lys Asp Glu Cys Trp Arg Gly
using Memoize
@memoize function parseS(T::Union{Type{Baze},Type{Amino}},s::Symbol)
dat = Dict(value => key for (key,value) in Base.Enums.namemap(T))
T(dat[s])
end
import Base.parse
parse(T::Union{Type{Baze},str)=parseS(T,Symbol(str))
现在让我们看看它是如何工作的。我不确定您是否更喜欢使用四元组还是密码子词典,无论如何,更改此代码已经很容易了。
julia> Codon = Tuple{Baze,Baze,Amino};
julia> codon1 = Codon(parse.(Codon.types,["U","C","A","Tyr"]))
(U,C,A,Tyr)
julia> codon2 = Codon(parseS.(Codon.types,[:U,:C,:A,:Tyr]))
(U,Tyr)
julia> codon3 = (U,Tyr)
(U,Tyr)
julia> codon1 === codon2 === codon3
true
在我看来像迷你遗传学框架:-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。