小编vie*_*rcc的帖子

使用RankNTypes的这个仿函数的名称是什么?

在围绕目标包玩游戏时,我注意到以下类型有趣的属性.

> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
Run Code Online (Sandbox Code Playgroud)

它是一个Functor.

> instance Functor (N f) where
>    fmap f (N nat) = N $ fmap (fmap f) nat
>          -- or,   = N $ \fx -> let { (x,a) = nat fx } in (x, f a)
Run Code Online (Sandbox Code Playgroud)

经过几个小时的google/hoogle,我放弃了找到包含此类型的任何现有模块. 这是什么类型的?如果众所周知,这个名字是什么?这有用还是被忽略因为没用?

这不是我100%的原始创作,因为N是从Objective包中找到的Object派生的.

> data Object f g = Object {
>     runObject :: forall …
Run Code Online (Sandbox Code Playgroud)

haskell functor higher-rank-types

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

快速算法优化算术表达式序列

编辑:澄清问题的描述

是否有快速算法解决以下问题? 并且,也是对于这个问题的extendend版本,将自然数替换为Z /(2 ^ n Z)?(这个问题太复杂了,无法在一个地方添加更多问题,IMO.)

问题:

对于给定的一组自然数,如{ 7,20,17,100 },所需的算法返回最短的加法序列,多重和权力计算所有给定的数字.每个序列项都是(正确的)等式,符合以下模式:

<number> = <number> <op> <number>
Run Code Online (Sandbox Code Playgroud)

其中<number>是一个自然数,<op>是{+,*,^}之一.

在序列中,<op>的每个操作数应该是其中之一

  • 1
  • 数字已经出现在相等的左侧.

例:

Input: {7, 20, 17, 100}
Output:
2 = 1 + 1
3 = 1 + 2
6 = 2 * 3
7 = 1 + 6
10 = 3 + 7
17 = 7 + 10
20 = 2 * 10
100 = 10 ^ 2
Run Code Online (Sandbox Code Playgroud)

我在Haskell中写了回溯算法.它适用于像上面这样的小输入,但我的真实查询是随机分布的〜[0,255]中的30个数字.对于真正的查询,以下代码在我的电脑中需要2~10分钟.

(实际代码, 非常简单的测试)

我目前的(伪)代码:

-- generate set …
Run Code Online (Sandbox Code Playgroud)

algorithm optimization numbers set

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