如果你在Haskell中编写生物信息学算法,你可能会使用代数数据类型来表示核苷酸:
data Nucleotide = A | T | C | G
Run Code Online (Sandbox Code Playgroud)
你会在标准ML或OCaml中做同样的事情,我假设(我从来没有真正使用过).
类型的值Nucleotide可以清楚地包含在两位中.但是,这样做会导致访问时间比每个Nucleotide值使用一个字节要慢,因为您需要使用二元运算符选择两个感兴趣的位.
因此,在决定如何表示代数数据类型时,编译器必须在内存效率和计算效率之间进行固有的权衡.此外,由于值可以是可变大小的事实,因此代数数据类型在内存中的表示变得更加复杂:
data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)
显然,Maybe a表单的值在Just a逻辑上大于表单的值Nothing.在这样一个极端的例子中:
data Hulk a b c d e = Big a b c d e | Little
Run Code Online (Sandbox Code Playgroud)
你肯定不希望存储Little值null指针或值中包含的五个值的零Big值.我假设你只是使用堆分配的可变大小的内存,在开头有一个构造函数ID(例如,0for Big和1for Little).但是,如果要Hulk在堆栈上存储值(表示更快),则必须将空白内存与Little值一起存储,以使该类型的所有值Hulk都具有相同的大小.另一个权衡.
Simon Marlow在之前的StackOverflow问题中回答了关于GHC的一般问题.但是,我有三个相关的问题仍然没有答案:
Nucleotide …memory haskell functional-programming sml algebraic-data-types
我正在尝试连接到C脚本中的MariaDB数据库,但我找不到必要的文档.我安装了libmariadbclient-dev,但是我找不到任何附带的文档,例如手册页.有一个基本的描述和有限的文件在这里,但文件仅包含的功能描述.事实是,尽管我已经搜索了各种各样的Google搜索结果,但我甚至不知道要导入什么来实现这一点,更不用说如何使用它了.是否有关于如何在C中使用MariaDB数据库的指南或文档?
我正在编写一个脚本来收集所有比特币块的哈希值.程序bitcoind,如果更改某个设置,则存储LevelDB数据库中所有块的元数据.每组元数据的关键是块的散列,它通常用作它的标识符.本质上,我试图从每个块中获取元数据的特定部分(事务ID).我正在写的脚本是在Haskell中,尽管我可以在必要时总是执行shell命令.总而言之,我不确定最简单的方法是找到所有块哈希(键),然后调用bitcoind来获取每个块的元数据.如果有任何方法可以直接从LevelDB数据库中获取每个值,那么也可以.什么是最简单有效的方法?
我想编写一个Haskell函数,该函数采用带有11个字段的自定义类型,并返回所有字段值的列表,或者将字段名称与其值相关联的映射.我不想明确地获得每一个领域,因为那将是冗长而且不那么通用的.有没有办法做到这一点?
当我尝试编译它时,以下do块会抛出错误"输入`conn'上的解析错误".我尝试过if-then-else语句的许多不同配置无济于事.在添加条件之前数据库逻辑工作,所以没有问题.我在其他地方有太多行吗?有没有办法解决这个问题而不完全修改逻辑?
main = do
contents <- BL.getContents
let myData = decode contents :: Maybe Data
if maybe True (\x -> result x /= "success") myData
then error ("JSON download failed")
else let myTrades = process myData
conn <- connectSqlite3 "trades.db"
insert <- DB.prepare conn "INSERT INTO trades VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"
DB.executeMany insert $ map (\xs -> map DB.toSql xs) myTrades
DB.commit conn
DB.disconnect conn
Run Code Online (Sandbox Code Playgroud) 我需要按顺序读取大文本文件,将大量数据存储在内存中,然后使用它们编写大文件.这些读/写周期一次完成一个,并且没有公共数据,因此我不需要在它们之间共享任何内存.
我尝试将这些过程放在一个脚本中,希望垃圾收集器在RAM满了时删除旧的,不再需要的对象.但事实并非如此.即使我在循环之间明确删除了对象,也需要比单独运行程序要长得多.
具体来说,该过程将挂起,使用所有可用的RAM,但几乎没有CPU.gc.collect()被召唤时它也挂了.因此,我决定将每个读/写过程拆分为单独的脚本,并使用中央脚本调用它们execfile().遗憾的是,这并没有解决任何问题.记忆仍然堆积如山.
我使用了简单明了的解决方案,即从shell脚本调用下标而不是使用execfile().但是,我想知道是否有办法使这项工作.有什么输入?
haskell ×4
c ×1
conditional ×1
custom-type ×1
github-pages ×1
jekyll ×1
leveldb ×1
mariadb ×1
memory ×1
parse-error ×1
python ×1
sml ×1