haskell - 如何在 Julia 中制作新类型?
问题描述
我写了一个用于翻译 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
我想写这样的朱莉娅代码。要制作像Base
or这样的新类型Amino
,我在 julia 文档中找到了抽象类型,但我找不到如何制作新类型。
如何定义新类型,例如Base
and 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},Type{Amino}}, str)=parseS(T, Symbol(str))
现在让我们看看它是如何工作的。我不确定您是喜欢 4-Tuple 还是 Codon 的 Dict 无论如何更改此代码已经很容易了。
julia> Codon = Tuple{Baze, 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, C, A, Tyr)
julia> codon3 = (U,C,A,Tyr)
(U, C, A, Tyr)
julia> codon1 === codon2 === codon3
true
对我来说看起来像迷你遗传学框架:-)
推荐阅读
- java - 如何在 ScrollView 底部添加字符串
- flutter - 在颤振中如何根据登录用户的类型导航到特定的主页?
- javascript - Textarea 没有正确调整大小
- akka.net - 是否有任何选项可以知道分片实体由 recovery(remember-entity=true) 重新启动
- deep-learning - 为掩码 R-CNN 进行图像注释的正确方法
- javascript - 如何模拟节点redis模块的createClient方法
- android - Android:错误:程序类型已存在:android.support.v4.app.INotificationSideChannel
- java - Netty 服务器发送一个由 Protobuf 编码的 byte[],但 C# 客户端 Socket.Receive 一直为 0
- javascript - 如何检查2个标签是否包含相同的图像
- javascript - 如何在日期验证后计算新日期?