我有一些可变的scala代码,我试图以更实用的方式重写.这是一段相当复杂的代码,所以我试图将它重构成碎片.我的第一个想法是:
def iterate(count:Int,d:MyComplexType) = {
//Generate next value n
//Process n causing some side effects
return iterate(count - 1, n)
}
iterate(2000000,initialValue)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎没有任何功能,因为我的代码中仍然存在混合副作用.我的第二个想法是这样的:
def generateStream(d:MyComplexType):Stream[MyComplexType] = {
//Generate next value n
return Stream.cons(n, generateStream(n))
}
for (n <- generateStream(initialValue).take(2000000)) {
//process n causing some side effects
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一个更好的解决方案,因为至少我已经从可变值处理代码中分离出了我的功能价值生成代码.但是,这样的内存效率要低得多,因为我生成了一个我不需要存储的大型列表.
这让我有3个选择:
我想我真正想要的是一个懒惰的评估序列,我可以在处理它们之后丢弃这些值.有什么建议?
functional-programming scala tail-recursion lazy-evaluation scala-2.8
问题:找到一个文件中但不存在于另一个文件中的ID.每个文件大约6.5 GB.具体而言(对于生物信息学领域中的那些),一个文件是测序读取的fastq文件,另一个是来自tophat运行的sam对齐文件.我想确定fastq文件中的哪些读取不在sam对齐文件中.
我收到了java.lang.OutOfMemory: Java heap space错误.正如所建议的那样(ref1,ref2)我正在使用惰性序列.但是,我的内存仍然不足.我看过这个教程,但我还不太了解它.所以我发布了一个不太复杂的尝试解决方案,希望我只是犯了一个小错误.
我的尝试:
由于这两个文件都不适合内存,因此sam文件中的行一次读取一个块,并将块中每行的id放入一个集合中.然后使用集合中的sam id过滤一个懒惰的fastq id列表,只保留那些不在集合中的id.使用下一个sam行和剩余的fastq id重复此操作.
(defn ids-not-in-sam
[ids samlines chunk-size]
(lazy-seq
(if (seq samlines)
(ids-not-in-sam (not-in (into #{} (qnames (take chunk-size samlines))) ids)
(drop chunk-size samlines) chunk-size)
ids)))
Run Code Online (Sandbox Code Playgroud)
not-in 确定哪些ID不在集合中.
(defn not-in
; Return the elements x of xs which are not in the set s
[s xs]
(filter (complement s) xs))
Run Code Online (Sandbox Code Playgroud)
qnames 从sam文件中的一行获取id字段.
(defn qnames [samlines]
(map #(first (.split #"\t" %)) samlines))
Run Code Online (Sandbox Code Playgroud)
最后,它与io放在一起(使用read-lines和 …
我正在Django开发一个课程注册网站,我想允许懒惰删除对象; 当一个对象被删除时,它只被标记为已删除,但并未真正从数据库中删除.
我在名为"已删除"的用户配置文件中添加了一个新的布尔属性.随后,我想覆盖Model的get/all/filter函数,以在检索数据集时排除已删除的对象.
如何覆盖默认的get函数?谢谢.
今天有人问起Lazy Binary Searches.不知道那是什么,我找了它,发现这篇文章:什么是懒二进制搜索?从本质上讲,惰性二进制搜索是一种二元搜索,您首先比较不等式,并且只比较一次的相等性 - 最后.
重点是什么?在什么情况下检查是否A<B容易,但检查是否A=B如此困难,你想尽可能避免它?
在Learn You a Haskell的第6章中,介绍了以下函数:
zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ [] _ = []
zipWith' _ _ [] = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys
Run Code Online (Sandbox Code Playgroud)
作者给出了几个使用它的例子,我发现它很容易遵循.然后这个:
ghci> zipWith' (zipWith' (*)) [[1,2,3],[3,5,6],[2,3,4]] [[3,2,2],[3,4,5],[5,4,3]]
Run Code Online (Sandbox Code Playgroud)
哪个输出 [[3,4,6],[9,20,30],[10,12,12]]
这是懒惰评估的一个例子吗?我试图将zipWith'翻译成Scheme(见下文).我使用了"简单"的例子,但不是最后一个,这让我觉得Haskell的懒惰可能会带来不同.
(define zipWith
(lambda (f listA listB)
(cond
((null? listA) (quote ()))
((null? listB) (quote ()))
(else (cons (f (car listA) (car listB)) (zipWith f (cdr listA) …Run Code Online (Sandbox Code Playgroud) scheme haskell partial-application lazy-evaluation higher-order-functions
getText = do
c <- getChar
s <- getText
return (c : s)
main = do
s <- getText
putStr s
Run Code Online (Sandbox Code Playgroud)
我期望看到的是每次按下'Enter'后输入线都会被回显.但没有任何回应...(我知道这是一个无限循环)它似乎不会" return"直到它上面的所有"IO"执行....
但是,以下代码:
main = do
s <- getContents
putStr s
Run Code Online (Sandbox Code Playgroud)
它在输入后立即显示该行.
鉴于功能getChar,我可以写一个getText表现得像getContents?
我正在阅读sbt文档,我在多项目构建一节中遇到了这个例子:
import sbt._
import Keys._
object HelloBuild extends Build {
lazy val root = Project(id = "hello",
base = file(".")) aggregate(foo, bar)
lazy val foo = Project(id = "hello-foo",
base = file("foo"))
lazy val bar = Project(id = "hello-bar",
base = file("bar"))
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在声明值之前引用值foo和bar?我认为它与lazy关键字有关,但是从我的阅读中,我认为lazy关键字只会延迟初始化?看来这里的值甚至在声明之前都在某种程度上,从不介意初始化......
希望有人能够解释这里发生了什么!
作为练习,我想我会尝试在Scala中实现一个不可变的双向链表.目前,lazy vals导致堆栈溢出.有人可以解释为什么会这样吗?我很确定递归函数通常会终止,但长度为3是一个非常小的数字,可以从终止函数创建溢出.似乎懒惰意味着它会陷入某个循环中.
class Node(val prev: Option[Node], val next: Option[Node], val id: Int){
override def toString = "["+id+"] "+next.toString
}
def addNodes(nNodes: Int, last: Node): Node = {
if(nNodes > 0){
lazy val newNode: Node =
new Node(Some(last), Some(addNodes(nNodes-1, newNode)),nNodes)
newNode
} else {
new Node(Some(last), None, nNodes)
}
}
def doublyLinked(n:Int) = {
lazy val list: Node = new Node(None, Some(addNodes(n-2, list)),n-1)
list
}
val x = doublyLinked(3)
println(x)
Run Code Online (Sandbox Code Playgroud) 我的grails应用程序中有一个外部和内部配置:
Config.groovy中
root = "/home/baseConf"
test {
dir = root + "/testDir"
}
Run Code Online (Sandbox Code Playgroud)
External.groovy
root = "/home/externalConf"
Run Code Online (Sandbox Code Playgroud)
内部控制器我有:
println "${grailsApplication.config.root}"
println "${grailsApplication.config.test.dir}"
Run Code Online (Sandbox Code Playgroud)
什么是印刷品:
/home/externalConf
/home/baseConf/testDir
Run Code Online (Sandbox Code Playgroud)
我想要打印的内容:
/home/externalConf
/home/externalConf/testDir
Run Code Online (Sandbox Code Playgroud)
如何通过在外部配置文件中交换这一个基本变量来更改在Config.groovy中使用一个基本变量的许多变量(如上例所示)?这样的事情甚至可能吗?
在这里,我又回来了(对我而言)我最新杰作的奇怪行为......
此代码应该读取文件,但它不会:
readCsvContents :: String -> IO ( String )
readCsvContents fileName = do
withFile fileName ReadMode (\handle -> do
contents <- hGetContents handle
return contents
)
main = do
contents <- readCsvContents "src\\EURUSD60.csv"
putStrLn ("Read " ++ show (length contents) ++ " Bytes input data.")
Run Code Online (Sandbox Code Playgroud)
结果是
Read 0 Bytes input data.
Run Code Online (Sandbox Code Playgroud)
现在我改变了第一个函数并添加了一个putStrLn:
readCsvContents :: String -> IO ( String )
readCsvContents fileName = do
withFile fileName ReadMode (\handle -> do
contents <- hGetContents handle
putStrLn ("hGetContents gave …Run Code Online (Sandbox Code Playgroud)