小编Dav*_*ave的帖子

为什么ghci给我一个"1 ++ 2"而不是ragequitting的类型?

GHCI会给我一个类型1 ++ 2:

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :t 1 ++ 2
1 ++ 2 :: Num [a] => [a]
Run Code Online (Sandbox Code Playgroud)

但这显然是错误的.如果我尝试评估它,而不是只是键入检查它,事情正确失败:

Prelude> 1 ++ 2

<interactive>:3:1:
    No instance for (Num [a0])
      arising from the literal `1'
    Possible fix: add an instance declaration for (Num [a0])
    In the first argument of `(++)', namely …
Run Code Online (Sandbox Code Playgroud)

haskell

25
推荐指数
2
解决办法
1065
查看次数

懒惰地将结结合起来进行一维动态规划

几年前我参加了算法课程,我们给出了以下问题(或类似的问题):

有一个n楼层的楼层,电梯一次只能上2层楼,一次只能下3层楼.使用动态编程编写一个函数,该函数将计算电梯从一层i到另一层所需的步数j.

使用有状态方法显然很容易,你创建一个数组n个元素,并用值填充它.你甚至可以使用一种技术上非有状态的方法,它涉及累积结果递归传递它.我的问题是如何通过使用延迟评估和打结来以非有状态的方式执行此操作.


我想我已经设计了正确的数学公式:

当i等于j并且f(i,j)= 1 + min,f(i + 2,j)和f(i-3,j)时,f(i,j)= 0

where i+2i-3是否在允许的值范围内.

不幸的是我不能让它终止.如果我i+2首先放置案例然后选择一个偶数楼层,我可以让它来评估目标等级以下的均匀楼层,但就是这样.我怀疑它直接射向最高的平坦地板,其他一切,下降3级,然后重复,永远在最顶层的几层之间振荡.

所以它可能以深度优先的方式探索无限空间(或有限但有环).我无法想象如何以广泛的方式探索这个空间而不使用其间有效模仿状态方法的大量数据结构.


虽然这个简单的问题令人失望,但我怀疑在一维中看到了一个解决方案,我可能能够使它适用于问题的二维变化.


编辑:许多答案试图以不同的方式解决问题.问题本身对我来说并不感兴趣,问题在于使用的方法.Chaosmatter创建一个minimal可以比较潜在无限数字的函数的方法可能是朝着正确方向迈出的一步.不幸的是,如果我尝试创建一个表示100层楼的列表,结果计算时间太长,因为子问题的解决方案不会被重用.

我尝试使用自引用数据结构,但它没有终止,存在某种无限循环.我会发布我的代码,这样你就可以理解我的目标.如果有人能够在自引用数据结构上使用动态编程实际解决问题,我会改变接受的答案,使用懒惰来避免多次计算事物.

levels = go [0..10]
  where
    go [] = []
    go (x:xs) = minimum
      [ if i == 7
          then 0
          else 1 + levels !! i
        | i <- filter (\n -> n >= 0 && n <= 10) [x+2,x-3] ]
      : go xs
Run Code Online (Sandbox Code Playgroud)

您可以看到如何1 + levels !! i尝试引用先前计算的结果以及如何filter (\n -> n >= …

algorithm haskell dynamic-programming lazy-evaluation tying-the-knot

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

将交互式会话管道化为文件

我制作了一个玩具交互式控制台程序,基本上是一个解释器:

$ myprogram
> this is user input
this is program output
Run Code Online (Sandbox Code Playgroud)

我想将整个会话(用户输入和程序输出)传递到日志文件中.我可以这样做:

$ cat | tee >(myprogram | tee -a file.log) >> file.log
> this is user input
this is program output
$ cat file.log
> this is user input
this is program output
Run Code Online (Sandbox Code Playgroud)

因此,上述会话将照常显示在终端上,但也会复制到日志文件中.

有一个更好的方法吗?我不喜欢我必须两次写日志文件,也不喜欢在运行此命令之前我必须记得擦除它.

unix bash tee

9
推荐指数
3
解决办法
7849
查看次数

将闭包编译器的类型安全性与AMD(requirejs)一起使用的最坚固的方法是什么?

虽然JavaScript及其许多库(jQuery,RequireJS)允许创建许多优秀的网站,但我在考虑构建更大的网站时发现它缺乏类型安全性.

谷歌有一个很棒的闭包编译器,它允许你用JSDoc 注释你的JavaScript并进行类型检查.在尝试了它的丰富类型系统之后,我希望这会大大提高更长寿的JavaScript项目的可维护性.

唯一的问题是它与RequireJS等AMD库不能很好地协同工作.有一个实验性的--transform_amd_modules标志,用于连接JavaScript文件并通过消除它来处理范围.然而,这似乎是一种反模式,消除了RequireJS的大部分好处(但保留了模块化文件结构).还有一个问题是未来将获得多少支持

最终目标是类型安全,而不是昂贵的RequireJS的好处,这将是我最好的赌注?

PS:虽然我使用RequireJS作为AMD库的首选,但我不会反对使用不同AMD库的解决方案.

javascript type-safety google-closure-compiler requirejs

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

将Polymer或Web Components模板链接/编译为Angularjs Scope

我有一个Polymer组件(web组件),我在其中放置了一个角度控制器,如下所示:

<polymer-element name="x-display"
  attributes="title body">
  <template>
    <h2>{{title}}</h2>
    <p>{{body}}</p>
    <p ng-controller="XDisplayController" ng-bind="text"></p>
  </template>
  <script>
    Polymer('x-display', {
      title: "",
      body: ""
    });
  </script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

<x-display>被置于这样的页面:

<div ng-controller="PeopleController">
    <h1>People</h1>
    <input ng-model="query" type="text">
    <x-display ng-repeat="p in people | filter:query" 
        title="{{ p.name }}" body="{{ p.body }}"></x-display>
</div>
Run Code Online (Sandbox Code Playgroud)

这一切都很酷.除了一个例外,它的行为与您期望的完全相同,放置一大堆<x-display>标签,每个人一个,并用正确的值填充它们.我调用Polymer默认值为null,以便{{ p.value }}事件不会闪烁,但除此之外,它很简单.

问题是XDisplayControllerAngularjs解析嵌套的永不得到,因此永远不会成为真正的控制器.如果我这样定义它:

function XDisplayController($scope) {
    $scope.text = "blah blah";
    console.log("this never gets printed");
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,它没有受到影响.

我将如何使angularjs知道模板,理想情况下我将如何使它继承父作用域,使其表现得像放置在页面上一样,就像使用angular指令一样?

我怀疑它可能与$ compile有关但我无法让它工作.

哦,我应该提一下,Polymer有生命周期回调,这可能是调用任何链接angularjs代码的合适位置.

编辑:我尝试了CodeHater的代码,将element.contents()更改为element.context.impl,并收到以下错误: …

angularjs polymer

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