我试图在元素列表上实现一般的滑动窗口算法.一个常见的用例是在长度为5的所有窗口中找到最大的数字.或者它可以计算窗口中有多少元素对于某个谓词是真的.
滑动窗口从左向右,并保持一些数据结构.一个元素落在它调用remove数据结构的窗口之外.如果一个新元素落在窗口内,我们add将元素放到数据结构中.它还有一个函数aggregate,可以在数据结构上计算某些东西.
要使用的天真数据结构是一个出列的,但是有可能有人希望将其他类型的数据结构用于特殊用例.
我最初的想法是拥有一个看起来像这样的长功能
runSlidingWindow :: (c->(Int,a)->c) -- add
-> (c->(Int,a)->c) -- remove
-> (c->b) -- aggregate
-> c -- identity
-> Int -- width
-> [(Int,a)] -- input
-> [(Int,b)]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一些Haskell方式,所以我们可以定义一些类Window a b c,这样我们就可以重写函数了
runSlidingWindow :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> [(Int,a)]
-> [(Int,b)]
runSlidingWindow window input
Run Code Online (Sandbox Code Playgroud)
当然我不认为上面是有效的Haskell代码.我们想强制任何类型的实例Window a b c具有表单的功能
add :: (Window a b c=>WindowInstance a b c)
-> …Run Code Online (Sandbox Code Playgroud) 我不明白为什么FingerTree用类类实现Measured.
我正在尝试实现一个monoid序列,其默认度量与monoid相同,所以我写了以下内容.
instance Monoid a => Measured (Sum Int, a) a where
measure x = (Sum 1, x)
Run Code Online (Sandbox Code Playgroud)
当然,由于FingerTree它本身就是一个Measured,这是不可能的,因为我们将得到类型类重叠.
在什么时候将这个单个函数抽象为类型类是有意义的?为什么我们不能只定义FingerTree所以我们可以将一个度量函数提供给构造函数?
知道是否有办法克服这个问题也很好.我可以每次为我的特定用例定义一个新实例,但也许有更好的方法.
不是作业.
给出两个相同长度的字符串S和T. 给定一组替换规则,在S中找到子串A并用字符串B替换它.A和B具有相同的长度.
是否存在一系列规则应用程序,以便将字符串S转换为字符串T?
示例:我们有更换规则
cat->dog
dog->cut
Run Code Online (Sandbox Code Playgroud)
我们有字符串S1:awesomecat和S2:awesomecut
一系列的替换可以是
awesomecat
awesomedog cat->dog
awesomecut dog->cut
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,有可能存在这样的规则.
cat->dog
ate->dog
dog->cat
Run Code Online (Sandbox Code Playgroud)
我相信没有比在每个州都尝试每一条规则更好的方法来回答这个问题.这将是指数时间.但我不知道是否有更好的解决方案.
我已经实现了一个代码,该代码在给定基本情况和线性递归关系的系数的情况下生成无限序列.
import Data.List
linearRecurrence coef base | n /= (length base) = []
| otherwise = base ++ map (sum . (zipWith (*) coef)) (map (take n) (tails a))
where a = linearRecurrence coef base
n = (length coef)
Run Code Online (Sandbox Code Playgroud)
这是Fibonacci数的实现.fibs = 0:1 :( zipWith(+)fibs(tail fibs))
很容易看出来
linearRecurrence [1,1] [0,1] = fibs
Run Code Online (Sandbox Code Playgroud)
但是计算的时间fibs!!2000是0.001 秒,大约是1 秒(linearRecurrence [1,1] [0,1])!!2000.速度的巨大差异来自哪里?我已经使一些功能严格.例如,(sum . (zipWith (*) coef))被替换为(id $! (sum . (zipWith (*) coef))),并没有帮助.
我用Smith-Waterman算法编写了解决局部对齐问题的代码.
我希望通过输入长度为10000的字符串,合理的内存(低于2GB的RAM)和合理的时间(低于5分钟)来完成此操作.
起初我正在使用生物库的内置功能,它运行速度太慢,在我杀死它之前吃了4GB的ram.
请注意,实现相同算法的java程序jAligner可以使用小于1GB的内存并且不到20秒来解决此问题.
当我写一个未装箱的版本时,程序给了我<<loop>>.我认为这是因为在完全构建数组之前,数组需要访问数组中的项.
所以我想知道是否有可能为这种更大的动态编程问题编写具有类似性能的Haskell代码.
module LocalAlign where
--import Data.Array.Unboxed
import Data.Tuple
import Data.Array
localAffineAlignment :: (Char -> Char -> Int)
-> Int
-> Int
-> String
-> String
-> (Int, (String, String, String, String))
localAffineAlignment f g e s' t' = (score, best) where
n = length s'
m = length t'
s= array (0,n-1) $ zip [0..n-1] s'
t= array (0,m-1) $ zip [0..m-1] t'
table :: (Array (Int,Int) Int,Array (Int,Int) Int)
table = (c,d) …Run Code Online (Sandbox Code Playgroud) 我有很多对象,每个对象都有许多不同的属性.许多属性重叠,例如,许多对象具有属性"name".由于存在许多类型的对象,如果为具有相同属性集的每组对象构造一个表,则将占用大量表.
目前我正在使用mysql,它以这种方式存储.
object_id|attribute_id|data
Run Code Online (Sandbox Code Playgroud)
有这样的几个表,不同的表有不同类型的数据.例如,在Integer表中,它只存储整数
所以我可以在系统中存储所有类型的对象,并且仍然可以根据属性的数据进行过滤和排序.它使查询更复杂,我认为它不是有效的.
这是在mysql或其他关系数据库中执行此操作的唯一方法吗?我应该尝试为此问题找到其他数据库模型吗?
编辑 我做了一些研究,似乎我需要的是一个具有SQL功能的面向文档的数据库.
是否存在任何现有语言,程序员可以随时更改语言的语法?
这意味着可以用自己喜欢的语法编写语言,并且有一些翻译器将其翻译回某些"标准代码",可以编译或解释.
代码也是可读的,因为"标准代码"可以转换为另一个编码器喜欢的代码版本.
我有这个问题,因为有些人可能喜欢语言的设计,但不喜欢语法.(例如,Lisp用[]代替(),Lisp用f(x)代替(fx)).
此外,如果有人可以提供有关此类主题的一些学术资源,那就太好了.
编辑:我发现了一个,FreeForm.
我希望覆盖int []数组的equals.这样以下就是真的
int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println(a.equals(b));
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?