小编Rob*_*een的帖子

什么时候使用STRef或IORef?

STRef和IORef的区别究竟是什么?我何时使用它们?据我所知,他们两个都是可变状态所以它们​​两者存在的意义何在?

haskell ioref

20
推荐指数
2
解决办法
2491
查看次数

IORef和MVar有什么区别?

我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦.有人可以帮我解决这个问题吗?他们似乎解决了同样的问题.MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数.

谢谢!

multithreading haskell ioref

18
推荐指数
1
解决办法
1490
查看次数

Haskell - 双重人格IO/ST monad?

我有一些代码目前使用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"的方法调用它它.

monads haskell io-monad st-monad

18
推荐指数
2
解决办法
1380
查看次数

对于非常规递归类型,catamorphism(fold)的类型是什么?

许多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 …

haskell types catamorphism recursion-schemes

18
推荐指数
1
解决办法
479
查看次数

使ScalaCheck测试确定性

我想暂时在我的specs2测试套件中进行ScalaCheck属性测试,以便于调试.现在,每次重新运行测试套件时都会生成不同的值,这会使调试变得令人沮丧,因为您不知道观察到的行为的变化是由代码更改引起的,还是仅仅是由生成的不同数据引起的.

我怎样才能做到这一点?是否有正式的方法来设置ScalaCheck使用的随机种子?

我正在使用sbt运行测试套件.

奖金的问题:是否有一个正式的方式打印出由ScalaCheck使用的随机种子,这样就可以重现即使是非确定性的试运行?

scala scalacheck specs2

16
推荐指数
1
解决办法
1451
查看次数

Windows环境变量名称和值的有效字符是什么?

经过一些研究,我发现名称的长度限制为255,值为32767个字符.

但是哪些字符可以用于名称
哪些字符允许

windows invalid-characters environment-variables special-characters

16
推荐指数
2
解决办法
9047
查看次数

github网络图查看器的替代品?

当我点击github上的"forks"按钮时,我想得到一个摘要,这是我用网络图形查看器得到的 - 但它并不完全理想.

理想的是总结:

  • 显示提交消息并列出已更改的文件
  • 排除已合并到其他分支的提交和分支
  • 排除已合并到其他分支的提交和分支,即使git不"知道"它们已被合并(即樱桃选择或rebase而不是明确的git merge或pull)
  • 给出叉子"动量"的一些指示(例如提交率,从它分叉而不是从原件分叉的叉子数量等),这样你就可以意识到叉子何时成为事实上的标准版本.
  • 除了github分支之外,它还可以与任何给定的相关存储库列表一起使用

在可用性方面,理想情况应该是:

  • 在触摸屏设备上工作得很好(你不能将鼠标悬停在指针上,浏览器可能已经在使用手势进行导航,所以你必须使用[屏幕上]键盘来滚动github网络图).这可能意味着只是一个完全文本的UI,或者它可能意味着不使用工具提示的GUI.
  • 适用于"胖子"用户(包括触摸屏用户,也包括残疾人/老年用户).单击或悬停在一个小小的点上查看提交可能会令人沮丧.它不一定是这样.

该工具不一定必须显示分支之间的图形关系.我一般对变化的东西最感兴趣,而且我看到的大多数叉子都是简单的线性叉子.

这对于有大量货叉的回收来说特别有用.

我不介意该工具是否必须从github的所有分支中获取所有分支来执行此操作(尽管使用某种形式的缓存使其成为基于Web的公共应用程序可能是有意义的,以减少github上的负载流行的或重度分叉的回购).

git github

15
推荐指数
1
解决办法
3593
查看次数

用经过身份验证的repo覆盖sbt默认解析器?

我有一个带认证的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时总是会失败

有什么方法可以只使用我的回购,并验证成功吗?

scala sbt

15
推荐指数
1
解决办法
5697
查看次数

14
推荐指数
2
解决办法
4526
查看次数

Scala中的Iteratees使用惰性求值或融合?

我听说迭代是懒惰的,但他们究竟有多懒?或者,迭代可以与后处理函数融合,以便不必构建中间数据结构吗?

我可以在我的iteratee中例如Stream[Option[String]] 从ajava.io.BufferedReader构建一个100万个项目,然后None以组合方式过滤掉s,而不需要将整个Stream保存在内存中吗?同时保证我不会砸堆栈?或类似的东西 - 它不必使用Stream.

我目前正在使用Scalaz 6,但如果其他迭代实现能够以更好的方式执行此操作,我有兴趣知道.

请提供完整的解决方案,包括关闭BufferedReader和致电unsafePerformIO(如果适用).

scala scalaz iterate

14
推荐指数
1
解决办法
961
查看次数