STRef和IORef的区别究竟是什么?我何时使用它们?据我所知,他们两个都是可变状态所以它们两者存在的意义何在?
我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦.有人可以帮我解决这个问题吗?他们似乎解决了同样的问题.MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数.
谢谢!
我有一些代码目前使用ST monad进行评估.我不喜欢将IO放在任何地方,因为该runST方法产生纯粹的结果,并指示这样的结果可以安全地调用(相对unsafePerformIO).但是,由于我的一些代码变得更长,我确实希望将调试打印语句放入.
是否有任何类提供双重个性monad [或类型类机制],可以是ST或IO(取决于其类型或"isDebug"标志)?我记得SPJ在他的"Fun with Type Functions"论文中引入了一个"Mutation"类,它使用关联类型将IO与IORef和ST关联到STRef.这样的包存在某个地方吗?
非常感谢[第n次],CA McCann!使用该解决方案,我能够为支持pdebug函数的monad引入一个额外的类.该ST单子会忽略这些呼叫,而IO将运行putStrLn.
class DebugMonad m where
pdebug :: String -> m ()
instance DebugMonad (ST s) where
pdebug _ = return ()
instance DebugMonad IO where
pdebug = putStrLn
test initV = do
v <- newRef initV
modifyRef v (+1)
pdebug "debug"
readRef v
testR v = runST $ test v
Run Code Online (Sandbox Code Playgroud)
这在ghci中有一个非常幸运的结果.由于默认情况下表达式是IO类型,因此运行类似"test 3"的操作将导致IO monad运行,因此您可以轻松地调试它,然后在您真正想要运行时使用类似"testR"的方法调用它它.
许多catamorphisms似乎很简单,大多数用自定义函数替换每个数据构造函数,例如
data Bool = False | True
foldBool :: r -- False constructor
-> r -- True constructor
-> Bool -> r
data Maybe a = Nothing | Just a
foldMaybe :: b -- Nothing constructor
-> (a -> b) -- Just constructor
-> Maybe a -> b
data List a = Empty | Cons a (List a)
foldList :: b -- Empty constructor
-> (a -> b -> b) -- Cons constructor
-> List a -> b
Run Code Online (Sandbox Code Playgroud)
但是,对我来说不清楚的是,如果使用相同类型的构造函数,但使用不同的类型参数会发生什么.例如,而不是传递List …
我想暂时在我的specs2测试套件中进行ScalaCheck属性测试,以便于调试.现在,每次重新运行测试套件时都会生成不同的值,这会使调试变得令人沮丧,因为您不知道观察到的行为的变化是由代码更改引起的,还是仅仅是由生成的不同数据引起的.
我怎样才能做到这一点?是否有正式的方法来设置ScalaCheck使用的随机种子?
我正在使用sbt运行测试套件.
奖金的问题:是否有一个正式的方式打印出由ScalaCheck使用的随机种子,这样就可以重现即使是非确定性的试运行?
经过一些研究,我发现名称的长度限制为255,值为32767个字符.
但是哪些字符可以用于名称?
哪些字符允许值?
windows invalid-characters environment-variables special-characters
当我点击github上的"forks"按钮时,我想得到一个摘要,这是我用网络图形查看器得到的 - 但它并不完全理想.
我理想的是总结:
在可用性方面,理想情况应该是:
该工具不一定必须显示分支之间的图形关系.我一般对变化的东西最感兴趣,而且我看到的大多数叉子都是简单的线性叉子.
这对于有大量货叉的回收来说特别有用.
我不介意该工具是否必须从github的所有分支中获取所有分支来执行此操作(尽管使用某种形式的缓存使其成为基于Web的公共应用程序可能是有意义的,以减少github上的负载流行的或重度分叉的回购).
我有一个带认证的maven存储库,我希望sbt只使用maven存储库
我的build.sbt:
resolvers += "My Repo" at "https://my.repository.addresss/repo/"
externalResolvers <<= resolvers map { rs =>
Resolver.withDefaultResolvers(rs, mavenCentral = false)
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入时sbt clean compile,它仍然是从repo1.maven.org下载的,我无法覆盖它!
由于我的maven repo必须进行身份验证,因此当我将默认repo配置放在〜/ .sbt/repositories时总是会失败
有什么方法可以只使用我的回购,并验证成功吗?
你可能熟悉
他们都宣称自己是"Java DVR" - 是否有任何开源实现提供类似(甚至是他们的一部分)功能?
我听说迭代是懒惰的,但他们究竟有多懒?或者,迭代可以与后处理函数融合,以便不必构建中间数据结构吗?
我可以在我的iteratee中例如Stream[Option[String]] 从ajava.io.BufferedReader构建一个100万个项目,然后None以组合方式过滤掉s,而不需要将整个Stream保存在内存中吗?同时保证我不会砸堆栈?或类似的东西 - 它不必使用Stream.
我目前正在使用Scalaz 6,但如果其他迭代实现能够以更好的方式执行此操作,我有兴趣知道.
请提供完整的解决方案,包括关闭BufferedReader和致电unsafePerformIO(如果适用).