haskell - 如何在 Julia 中创建新类型?

标签 haskell types 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 

我想编写这样的 Julia 代码。为了创建像 BaseAmino 这样的新类型,我在 julia 文档中找到了抽象类型,但我找不到如何创建新类型。

如何定义新类型,例如 BaseUCAG

最佳答案

就是这里了。我既不了解基因组学,也不了解 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 字典,无论如何,更改此代码已经很容易了。

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

对我来说看起来像迷你遗传学框架:-)

关于haskell - 如何在 Julia 中创建新类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63608024/

相关文章:

python - 为什么编程语言同样限制 22/7 的精度?

c# - C# 可以存储比 double 更精确的数据吗?

sql - 您通常将哪种 T-SQL 数据类型用于权重和长度?

julia - 如何在 julia 的 SymTridiagonal 矩阵中分配非对角线条目?

数据框.jl : count rows by group while defining count column name

haskell - repa 中的动态规划

haskell - 一次在文件系统上执行多个操作的正确方法是什么?

haskell - 将 "bare"数字分配给新类型

io - 如何检查 Julia 中的文件是否为空?

javascript - 如何在 JSDoc 中将对象的值设置为类型