在围绕目标包玩游戏时,我注意到以下类型有趣的属性.
> {-# 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) 编辑:澄清问题的描述
是否有快速算法解决以下问题?
并且,也是对于这个问题的extendend版本,将自然数替换为Z /(2 ^ n Z)?(这个问题太复杂了,无法在一个地方添加更多问题,IMO.)
对于给定的一组自然数,如{ 7,20,17,100 },所需的算法返回最短的加法序列,多重和权力计算所有给定的数字.每个序列项都是(正确的)等式,符合以下模式:
<number> = <number> <op> <number>
Run Code Online (Sandbox Code Playgroud)
其中<number>是一个自然数,<op>是{+,*,^}之一.
在序列中,<op>的每个操作数应该是其中之一
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)