小编Mat*_*hid的帖子

Langage.Haskell.TH.report是如何工作的?

不幸的是,许多Template Haskell函数完全没有文档.一个这样的功能是report.它需要a Bool和a String,并使用指定的字符串作为错误消息产生编译错误.有没有人知道这到底Bool是为了什么?就我所知,两种价值都完全相同......

haskell template-haskell

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

在应用解析中苦苦挣扎

所以我正在编写一个复杂的解析器,只使用Applicative(有问题的解析器甚至根本没有实现Monad).

对于普通的解析器,这很容易.对于非平凡的......不是那么多.应用界面似乎猛烈地迫使你以无点样式编写所有内容.这是非常难以处理的.

例如,考虑一下:

call = do
  n <- name
  char '('
  trim
  as <- sepBy argument (char ',' >> trim)
  char ')'
  trim
  char '='
  r <- result
  return $ Call {name = n, args = as, result = r}
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试使用applicative来编写:

call =
  (\ n _ _ as _ _ _ _ r -> Call {name = n, args = as, result = r}) <$>
  name <*>
  char '(' <*>
  trim <*>
  sepBy argument (const const () <$> char ',' …
Run Code Online (Sandbox Code Playgroud)

parsing haskell applicative

6
推荐指数
2
解决办法
182
查看次数

使GHC忽略非范围内的错误

我正在构建一个模块,每次我编写一个函数时,它都会调用其他一些不存在的函数.显然它们最终会存在,但是在我编写代码之前能够进行语法检查会很好.

是否有一些标志组合,我可以使用GHC发出警告,而不是"名称foo不在范围内"的错误?

(如果GHC可以为不存在的名称选择一个类型签名,并且确认程序仍然可以进行类型检查,那将是很好的.这几乎就是"类型漏洞"功能所做的 - 但是要使用那,你仍然需要手动定义所有的标识符.)

haskell ghc

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

Haskell语言报告:reservedid的定义

好的,所以我花了一整天时间玩Haskell语言报告(2010),并找到各种"有趣"的边缘案例.您认为应该是错误的东西,但实际上是允许的.

特别是,请考虑以下词法语法参考(第10.2节)的摘录:

reservedid ? case | class | data | default | deriving | do | else
           | foreign | if | import | in | infix | infixl |
           | infixr | instance | let | module | newtype | of
           | then | type | where | _
Run Code Online (Sandbox Code Playgroud)

可能希望qualified在该列表中看到......但它不在那里.(也不是,as或者hiding就此而言.)

现在我想知道......这是否是报告中的意外疏忽?或者这是一个刻意的设计决定?

看起来GHC至少遵循规范的字母,因为它会愉快地允许你定义一个名字实际上是变量的变量qualified.很奇怪,但也是如此.所以看起来这个名字在一个上下文中只是"特殊的".相比之下,您永远不能命名变量module.我们本可以只在文件的开头使这个词特别...但我们没有.

syntax haskell

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

用于构建测试数据的monad

好的,所以我正在尝试编写一个用于构建测试数据的monad,但我无法让它按照我想要的方式工作.它看起来像这样:

runBuildM :: [i] -> BuildM i o x -> [o]
-- Given a list of i, build a list of o.

source :: BuildM i o i
-- Fetch unique i.

yield :: o -> BuildM i o ()
-- Return a new o to the caller.

gather :: BuildM i o x -> BuildM i o o
-- Fetch every possible o from sub-computation.

local :: BuildM i o x -> BuildM i o x
-- Isolate any …
Run Code Online (Sandbox Code Playgroud)

monads haskell

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

为什么这个C++程序在Windows上比Linux慢?

考虑以下程序:

#define _FILE_OFFSET_BITS 64   // Allow large files.
#define REVISION "POSIX Revision #9"

#include <iostream>
#include <cstdio>
#include <ctime>

const int block_size = 1024 * 1024;
const char block[block_size] = {};

int main()
{
    std::cout << REVISION << std::endl;  

    std::time_t t0 = time(NULL);

    std::cout << "Open: 'BigFile.bin'" << std::endl;
    FILE * file;
    file = fopen("BigFile.bin", "wb");
    if (file != NULL)
    {
        std::cout << "Opened. Writing..." << std::endl;
        for (int n=0; n<4096; n++)
        {
            size_t written = fwrite(block, 1, block_size, file); …
Run Code Online (Sandbox Code Playgroud)

c++ windows io microbenchmark

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

用Haskell筛选素数

好的,所以我正在尝试编写一个Haskell程序,它可以非常快速地计算素数.据推测,我不是第一个尝试这样做的人.(特别是,我确定我看到了一些现有技术,但我现在找不到它......)

最初,我想计算小于10 ^ 11的素数.目前我已经让我的程序运行了大约15分钟,它甚至还没到中途.一些狂热的C++程序员声称他的程序只需要8个 分钟.很明显,我正在做一些可怕的错误.

(如果重要的话,我当前的实现使用IOUArray Integer Bool多个线程来处理搜索空间的独立子范围.目前从10MB数组块中删除所有2的倍数需要几秒钟...)

请注意,10 ^ 11对于32位算术来说太大了.此外,10 ^ 11位= 12.5 GB,远远太多数据以适应Haskell的32位地址空间.所以你不能一次在内存中拥有整个位图.最后,请注意,小于10 ^ 11的素数只是小于2 ^ 32的阴影,因此您无法同时存储实际的整数.


编辑:显然我误读了时间信息.C++家伙实际声称的是:

  • 使用一个核心计算素数<10 ^ 11需要8分钟,使用4个核心需要56秒.(未指定CPU类型.)

  • 计数素数<10 ^ 10需要5秒.(不确定使用了多少个核心.)

抱歉错误...

编辑:我的源代码可以在这里找到:http://hpaste.org/72898

primes haskell

5
推荐指数
2
解决办法
1164
查看次数

Haskell可以[轻松]做COM吗?

好吧,所以我对COM并不是很了解.我所知道的是,如果您使用Microsoft赞助的编程语言之一编写代码,那么您可以编写类似3行代码的内容来启动Excel,打开一个空白工作簿,将一些数据填入单元格并告诉Excel绘制图形它.但我不知道这个黑魔法究竟是如何运作的; 我所知道的是它与COM有关.

用Haskell做这种事情有可能吗?它"容易",还是会变得非常困难?因为如果它很容易,我可能会尝试让它工作,但如果它真的很难,有更简单的方法来制作Excel图形的东西......

我知道你实际上并不需要学习COM只是为了绘制图形.(例如,我可以使用GraphVis或GNUplot,或者Google Chart,或者编写一个小的Cairo函数,或者......)我对使用Haskell进行COM操作有多么容易或者很困难,这只是一个激励性的例子.

com haskell

5
推荐指数
1
解决办法
206
查看次数

从代理返回异常

我正在使用大量未记录的 Castle 动态代理系统。我已经设法让它做我想做的几乎所有事情,除了一件事:如何让代理方法抛出异常而不是返回值?

public sealed class MyInterceptor : IInterceptor
{
  public void Intercept(IInvocation invocation)
  {
    if (CheckArgs(invocation.Arguments))
    {
      invocation.ReturnValue = DoRealWork(invocation.Arguments);
    }
    else
    {
      invocation.Exception = new InvalidOperationException(); // How?
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

c# castle-dynamicproxy

5
推荐指数
1
解决办法
1598
查看次数

如何在Elm中记录调用图?

请帮忙,这让我绝对疯了!

如何让Elm记录调用图?

听起来很简单,不是吗?该Debug.log功能应该让这个安静.但不,尽我所能,我只是不能强迫Elm以正确的顺序记录事件.我在这里失去理智......


让我们采取这样一个简单的函数:

factorial : Int -> Int
factorial n = if n < 2 then 1 else n * factorial (n-1)
Run Code Online (Sandbox Code Playgroud)

想要做的是编写自定义trace函数,以便我可以做类似的事情

factorial n = trace ("factorial " + toString n) (if n < 2 ...)
Run Code Online (Sandbox Code Playgroud)

它会记录类似的东西

factorial 3: ENTER
factorial 2: ENTER
factorial 1: ENTER
factorial 1: 1
factorial 2: 2
factorial 3: 6
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它进入每个函数,你可以看到它从每个函数返回(以及它实际返回的值).


什么行不通:

logging elm

5
推荐指数
2
解决办法
115
查看次数