小编byr*_*sos的帖子

关于"了解你的Haskell"的State Monad代码的困惑

我正在尝试使用在线书籍了解Haskell以获得很好的Haskell.

据我所知,到目前为止,我已经能够理解Monads,直到我介绍State Monad这一章.

然而,代码呈现并声称是Monad实现的State类型(我无法在Hoogle中找到它)对我来说似乎太过分了.

  • 首先,我不理解它背后的逻辑,即为什么它应该工作以及作者如何考虑这种技术.(可能会建议相关的文章或白皮书?)

  • 在第4行,建议函数f取1个参数.
    然而,几行下来我们会看到pop,它没有参数!

  • 为了扩展第1点,作者试图使用函数来表示状态.

非常感谢任何帮助理解正在发生的事情.

编辑

敬启者,

以下答案彻底涵盖了我的问题.
我想补充一点:

在阅读了下面提到的文章之后,我找到了上面第二点的答案:所有那段时间我都假设 pop函数会被用作:
stuff >>= pop因为在bind类型中第二个参数是函数,而正确的用法是这样的pop >>= stuff,我在再次阅读之后意识到,如何将符号转化为简单的绑定 - lambdas.

monads haskell state-monad

22
推荐指数
4
解决办法
4063
查看次数

使用as-patterns不绑定到Haskell中的完整List

好吧,也许标题有点令人困惑,但我想要做的是有这样的功能:f (a:b:c:d:is) = ...但能够参考a:b:c:d而不再写它.事实证明,我不能做类似的事情e@(a:b:c:d):is并获得预期的结果.有任何想法吗?

haskell haskell-platform

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

将函数映射到Haskell 2元素中的列表一次

我在Haskell 尝试了一些问题(在Spoj),我偶然发现了一些有输入形式的问题:

testcase_1
testcase_1_continued
testcase_2 
testcase_2_continued
Run Code Online (Sandbox Code Playgroud)

要么

testcase_1 testcase_1_continued
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只能通过使用wordslines在输入上然后映射求解器函数来获得类似的东西来解决这个问题

[solver test1, solver test2, ...]
Run Code Online (Sandbox Code Playgroud)

一个人应该使用一个带有两个参数的函数,这两个参数是两个列表元素,一个接一个,并得到:

[solver test1 test1continued, solver test2 test2continued, ...]
Run Code Online (Sandbox Code Playgroud)

所以我很高兴找到一个类似的函数,map一次应用一个函数2的参数.我一直无法在Hoogle上找到任何东西,而且编写这样的函数也很容易,我正在寻找更多问题的一般方法.或者,如果我的方法(坚持map)肯定是错误的,那么我也可以指出正确的方向.

编辑:

我实际上发现实现一个函数map2非常有用,它将一个函数映射到一个列表,一次只能处理两个参数:

map2 f [a,b,c,d] ==> [f a b, f c d]
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
1840
查看次数

用于模拟数组的数据结构,可以在任何位置添加数据?

我想存储少量具有恒定大小(ac char)的项目(小于255),并且能够执行以下操作:

  • 将值附加到任意位置,并让其他项保留其先前的顺序.

  • 删除项目并让其他项目保留其订单(如上所述).

  • 找到项目的下一个和上一个.

我已经尝试过使用一个数组并通过将所有项目移动到一个地方前面来创建一个函数来添加一个值.删除可能会发生一些事情,但效率太低.当然,我不介意使用库,只要它随时可用且免费.

c data-structures

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

为什么这个perl脚本运行速度慢于它的c对应?

我在perl中解决了这个琐碎的spoj问题.所以我提出了这个解决方案:

while ("0 0 0\n" ne ($string = <STDIN>)) {
  my @a = split ' ', $string;
  $a1 = $a[0];
  $a2 = $a[1];
  $a3 = $a[2];

  if($a2 - $a1 == $a3 - $a2) {
    $c  = $a2 - $a1;
    $a4 = $a3 + $c;
    print("AP ", $a4);
  }
  else {
    $c  = $a2 / $a1;
    $a4 = $a3 * $c;
    print("GP ", $a4);
  }

  print "\n";
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,它超过了时间限制.当我在C中尝试相同的事情时,它以最小的运行时间成功运行.这是C版本:

#include <stdio.h>

int main()
{
  int a1, a2, a3, a4, …
Run Code Online (Sandbox Code Playgroud)

c perl

0
推荐指数
1
解决办法
276
查看次数