不幸的是,许多Template Haskell函数完全没有文档.一个这样的功能是report.它需要a Bool和a String,并使用指定的字符串作为错误消息产生编译错误.有没有人知道这到底Bool是为了什么?就我所知,两种价值都完全相同......
所以我正在编写一个复杂的解析器,只使用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) 我正在构建一个模块,每次我编写一个函数时,它都会调用其他一些不存在的函数.显然它们最终会存在,但是在我编写代码之前能够进行语法检查会很好.
是否有一些标志组合,我可以使用GHC发出警告,而不是"名称foo不在范围内"的错误?
(如果GHC可以为不存在的名称选择一个类型签名,并且确认程序仍然可以进行类型检查,那将是很好的.这几乎就是"类型漏洞"功能所做的 - 但是要使用那,你仍然需要手动定义所有的标识符.)
好的,所以我花了一整天时间玩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.我们本可以只在文件的开头使这个词特别...但我们没有.
好的,所以我正在尝试编写一个用于构建测试数据的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) 考虑以下程序:
#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) 好的,所以我正在尝试编写一个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
好吧,所以我对COM并不是很了解.我所知道的是,如果您使用Microsoft赞助的编程语言之一编写代码,那么您可以编写类似3行代码的内容来启动Excel,打开一个空白工作簿,将一些数据填入单元格并告诉Excel绘制图形它.但我不知道这个黑魔法究竟是如何运作的; 我所知道的是它与COM有关.
用Haskell做这种事情有可能吗?它"容易",还是会变得非常困难?因为如果它很容易,我可能会尝试让它工作,但如果它真的很难,有更简单的方法来制作Excel图形的东西......
我知道你实际上并不需要学习COM只是为了绘制图形.(例如,我可以使用GraphVis或GNUplot,或者Google Chart,或者编写一个小的Cairo函数,或者......)我对使用Haskell进行COM操作有多么容易或者很困难,这只是一个激励性的例子.
我正在使用大量未记录的 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) 请帮忙,这让我绝对疯了!
如何让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)
所以你可以看到它进入每个函数,你可以看到它从每个函数返回(以及它实际返回的值).
什么行不通:
明显的第一次尝试是做类似的事情
trace : String -> x -> x
trace label x =
let
_ …Run Code Online (Sandbox Code Playgroud)