小编Mat*_*hid的帖子

这可以用STM完成吗?

免责声明:这可以使用MVar ()简单的互斥锁轻松完成.我只是想知道它是否可以用STM完成.

我想原子地做以下事情:

  • 阅读一些变量.

  • 根据我刚刚阅读的内容决定要执行的I/O.

  • 执行I/O.

  • 将结果记录在变量中.

具体来说,假设我想跟踪我已读取的输入字节数,并假设在消耗了一定数量的字节后达到了EOF.(好吧,让两个线程同时从同一个文件中读取,可能是首先要做的事情,但请跟我一起去...)

显然,这不能是单个STM交易; 中间是I/O. 显然,将它作为两个未连接的交易也是错误的.(两个线程可以看到剩下一个字节的配额,并且都决定读取该字节.)

这个问题有一个很好的解决方案吗?或者STM只是这个任务的错误工具?

haskell stm

10
推荐指数
2
解决办法
610
查看次数

Haskell中的并行图形处理

图形是那些"令人尴尬的并行"问题之一.Haskell应该真的非常适合并行处理.所以我的问题是:

  1. 在渲染问题上抛出尽可能多的CPU内核的最佳方法是什么?

  2. 是否有可能让GPU完成任务?

通过"渲染问题",我指的是诸如以下问题:

  • 每个像素的颜色都是其坐标的纯函数.

  • 我们从现有的"输入"图像开始,并且每个"输出"像素的颜色是相应输入像素的纯函数,或者可能是这种像素的小邻域.


关于#1:这看起来很简单,但事实并非如此.有几种可能的数据结构选择来存储计算出的像素(这会影响您如何访问它,以及您可以轻松地将结果转储到磁盘或屏幕上).有多种方法可以在多个核上执行.等等.

在我看来,Data Parallel Haskell将是这类事物的理想选择.但是,上次我检查时,DPH还没有工作.就是这样.即使假设它确实有效,你可能会创建一个并行数组来保存像素,然后你必须复制像素以在屏幕上显示它们或将它们写入磁盘.

我会尝试引发每一个像素,但这可能太精细了.我可以将像素作为列表并使用其中一个并行列表策略.或者我可以使它成为一个(未装箱?)不可变数组并编写一些手动代码来启动火花.或者我可以使用显式线程和可变数组.或者我可以拥有一堆工作线程,它们通过通道将像素值传输到主线程,将结果放到正确的位置.要么...

总之,这里有很多可能性,我不确定哪个是最好的.


关于#2:显然,这类问题是GPU首先存在的全部原因.显然,GPU非常适合攻击这些类型的问题.我的问题是"从哈斯克尔那里做这件事难吗?"

parallel-processing graphics haskell

9
推荐指数
2
解决办法
2300
查看次数

移动已编译的Haskell程序

我想在一个Linux机器上编译一个Haskell程序,然后在另一个Linux机器上运行它.但是,这似乎根本不起作用.我收到有关缺少库的错误.

据推测,当我安装GHC时,包管理器还会安装所需的所有库和内容.[我有些恼怒地注意到至少有一个包装系统无法安装GCC,如果没有GHC,GHC显然无法运行......]但是当然,目标系统没有安装这些依赖项.因此,如果我将已编译的二进制文件复制到目标系统,它就无法运行.

有什么方法可以解决这个问题吗?我习惯使用Windows,如果你编译一些东西,它只适用于所有Windows系统.(至少,直到你真正尝试使用非标准设施,如数据库访问或其他东西......)我在Haskell中编译了Hello World,将其复制到另一个Linux盒子,并抱怨libgmp.so.10缺失或像那样神秘的mumbo-jumbo.

只是为了让事情变得有趣:我只有FTP访问目标机器,而不是shell访问.我甚至不完全确定它正在运行什么操作系统.所以我可以以任何我想要的方式更改我的构建机器,但除了将文件复制到目标机器之外,我无法对目标机器做任何事情.

linux haskell ghc

9
推荐指数
1
解决办法
1219
查看次数

TeamCity测试失败统计信息

我有一个TeamCity构建设置,除了运行集成测试之外什么都不做.可悲的是,这些测试有点不可靠.他们中的大多数工作正常,但有些人会不时地间歇性地失败.

我非常希望能够获得最常见的测试失败的图表.基本上我想知道哪些测试最常失败.

我知道TC可以显示任何单个测试的通过/失败统计数据.但是我不打算点击所有400多个测试来找出哪些测试最常失败!

如果不能让TC向我显示这些信息,是否有一些界面可以让我下载数据,以便我自己处理?

teamcity automated-tests

9
推荐指数
1
解决办法
2641
查看次数

使monadic代码更短

请考虑以下代码:

transform :: Foo -> Bar
transform foo =
  case foo of
    Foo1 x     -> Foo1 x
    Foo2 x y   -> Foo2 x (transform y)
    Foo3 x y z -> Foo3 x (transform y) (transform z)
Run Code Online (Sandbox Code Playgroud)

现在假设由于某种原因我改变它以在monad中工作(例如,因为我有状态我想随身携带或其他).现在我们有

transform :: Foo -> State Int Bar
transform foo =
  case foo of
    Foo1 x     -> return $ Foo1 x
    Foo2 x y   -> do
      y' <- transform y
      return $ Foo2 x y'
    Foo3 x y z -> do
      y' <- transform …
Run Code Online (Sandbox Code Playgroud)

monads haskell

9
推荐指数
1
解决办法
215
查看次数

关于monads和LINQ

我偶然发现一些声明表明LINQ是由monad驱动的.

几个C#程序员已经问过monad是什么以及LINQ是怎么样的.但我是一名Haskell程序员,我问的是LINQ是什么以及它是如何拥有monad的.

我对LINQ的了解很少,它允许你在C#代码中间编写任意SQL.我被告知它可以为其他数据类型实现LINQ,但我从未见过它.据推测,这是事情变得有趣的部分.(?)

任何评论或有用的阅读将不胜感激.

linq monads haskell

8
推荐指数
0
解决办法
908
查看次数

非整数的任意精度

Haskell有一个内置Integer类型,它处理任意精度的整数.还有Rational,这是一个任意精度的分数.但是对这些事情的算术需要找到一个共同的分母,然后将结果取消到最少的条件.

如果我想在尾数中使用(例如)100位精度进行浮点运算,该怎么办?我该怎么办?

我看到有一个Data.Fixed模块,但这似乎提供了一些具有固定精度的自定义编写类型.我想要的是根据每项任务需要多少准确度,我可以在运行时动态增加或减少精度的东西.

PS.我不是在寻找十进制算术,虽然我想知道是否可以在某处使用它会很有趣......

math haskell

8
推荐指数
1
解决办法
192
查看次数

QuickCheck值相等

我有一个QuickCheck属性,如下所示:

prop42 :: Foo -> Bool
prop42 foo = fn1 foo == fn2 foo
Run Code Online (Sandbox Code Playgroud)

如果此属性失败,它将打印出来的内容foo.但我真的很想知道什么fn1并且fn2回来了.如果foo很大,手动生成这些信息有点不重要.(即,坐在那里,手动输入打印到Windows控制台窗口的巨大文本块.)

测试框架有一个比较相等的东西,并且如果相等不成立则打印出两个值是很常见的.但我似乎无法为QuickCheck找到这样的功能......

haskell quickcheck

7
推荐指数
1
解决办法
164
查看次数

键入私人类型的签名

好的,所以这是一个不起眼的语言角落:

Haskell允许您导出标识符,该标识符的类型签名提到导出的类型.究竟是什么语义?

例如,假设我有

module Foobar (bar) where

data Foo = ...

bar :: String -> Foo
Run Code Online (Sandbox Code Playgroud)

Foo不会导出,bar而是.但是bar提到的类型Foo.许多编程语言都不允许你这样做,但Haskell确实如此.

所以现在怎么办?似乎我可以打电话bar,但是结果不能做多少.特别是,我(大概)不能说出结果类型的名称,这有点奇怪.据推测,如果模块导出了一些Foo作为输入的函数,我应该能够将那些以我的结果作为输入的函数调用...但是在类型签名中我不能这么说.

当然,做上述事情并不是一个好主意 ; 我不打算在实际代码中这样做.我只是好奇它实际上了什么.

haskell types

7
推荐指数
1
解决办法
157
查看次数

Applicative Functor中的条件循环

假设这Parser x是一个解析的解析器x.这个解析器可能拥有一个many组合器,可以解析零次或多次出现的事情(当项解析器失败时停止).

如果Parser形成一个monad ,我可以看到如何实现它.如果Parser只是一个Applicative Functor,我无法弄清楚如何做到这一点.似乎没有任何方法可以检查以前的结果并决定下一步该做什么(正是monad添加的概念).我错过了什么?

parsing haskell applicative

7
推荐指数
1
解决办法
105
查看次数