小编joh*_*ink的帖子

使用getChar重新实现getContents

在我对Haskell中抓住懒惰IO的哀悼中,我尝试了以下方法:

main = do
  chars <- getContents
  consume chars

consume :: [Char] -> IO ()
consume [] = return ()
consume ('x':_) = consume []
consume (c : rest) = do
  putChar c
  consume rest
Run Code Online (Sandbox Code Playgroud)

它只是回显了所有在stdin中键入的字符,直到我点击'x'.

所以,我天真地认为应该可以getContents通过getChar以下几点做一些事情来重新实现:

myGetContents :: IO [Char]
myGetContents = do
  c <- getChar
  -- And now?
  return (c: ???) 
Run Code Online (Sandbox Code Playgroud)

事实证明它不是那么简单,因为它???需要一个类型的功能IO [Char] -> [Char]- 我认为 - 打破IO monad的整个想法.

检查getContents(或更确切地说hGetContents)的实施揭示了整个香肠工厂的脏IO东西.我的假设是否正确,myGetContents如果不使用脏的,即monad-breaking代码, 就无法实现?

haskell lazy-io

6
推荐指数
1
解决办法
170
查看次数

如何在Groovy中构建可重新初始化的惰性属性?

这就是我想做的事情:

class MyObject {
    @Lazy volatile String test =  {
        //initalize with network access
    }()
}

def my = new MyObject()
println my.test

//Should clear the property but throws groovy.lang.ReadOnlyPropertyException
my.test = null 

//Should invoke a new initialization
println my.test
Run Code Online (Sandbox Code Playgroud)

不幸的是,惰性字段是Groovy中的只读字段,清除属性会导致异常.

知道如何重新实现惰性字段,而无需重新实现@Lazy注释提供的双重检查逻辑吗?

更新:

考虑soft = true(从第一个答案开始)让我进行了一些测试:

class MyObject {
    @Lazy() volatile String test =  {
        //initalize with network access
        println 'init'
        Thread.sleep(1000)
        'test'
    }()
}

def my = new MyObject()
//my.test = null 
10.times { zahl ->
    Thread.start {println "$zahl: …
Run Code Online (Sandbox Code Playgroud)

groovy lazy-evaluation

4
推荐指数
1
解决办法
1329
查看次数

标签 统计

groovy ×1

haskell ×1

lazy-evaluation ×1

lazy-io ×1