小编hyi*_*tiz的帖子

模块化行程编码

如何实现运行长度编码模数n>=1?因为n=4,考虑到输入AAABBBBABCCCCBBBDAAA,我们想要一个输出[('D', 1), ('A', 3)]。注意由于模数运算导致的长距离合并。见说明。

解释

中第一次出现BBBB编码到(B, 4)modulus 4(B, 0),从而消除本身进行。参见图表(忽略空格;它们仅用于说明目的):

AAABBBBABCCCCBBBDAAA
A3  B4 ABCCCCBBBDAAA
A3  B0 ABCCCCBBBDAAA
A3     ABCCCCBBBDAAA
A4      BCCCCBBBDAAA
A0      BCCCCBBBDAAA
        BCCCCBBBDAAA
        ... 
                DA3
Run Code Online (Sandbox Code Playgroud)

一个更简单的例子,当没有合并发生时,因为没有被取消modulus 4:输入AAABABBBC产生输出[('A',3),('B',1),('A',1),('B',3),('C',1)]

要求

  • Haskell 实现是首选,但也欢迎其他实现!
  • 比 3rd 方库更喜欢标准/公共库函数。
  • 首选使用高阶函数的可读和简洁的程序。
  • 优先考虑效率(在不必要时不要遍历整个列表)

我的程序

我在 Haskell 中实现了这个,但它看起来太冗长而且读起来很糟糕。关键思想是一次检查三个元组,如果我们既不能取消0元组也不能在手头的三个元组中合并一对元组,则只向前推进一个元组。

import Data.List (group)

test = [('A', 1), ('A', 2), ('B', 2), ('B', …
Run Code Online (Sandbox Code Playgroud)

compression algorithm haskell list finite-group-theory

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

为字典实现 Applicative 实例(Map、关联数组)

为关联数组实现函子实例(本质上是一个映射操作)似乎很简单(例如参见Functor定义 [1])。但是,Applicative未定义实例。Maps 不是 Applicatives 是否有很好的理论理由?要使它们成为 Applicative,还需要哪些额外的约束?

[1] https://hackage.haskell.org/package/containers-0.6.3.1/docs/Data-Map-Strict.html

haskell functional-programming separation-of-concerns data-structures

5
推荐指数
0
解决办法
182
查看次数

任何顺序或维度的 Haskell 列表理解

考虑以下程序。

chars = [" "] ++ ["A"] ++ ["B"] ++ (repeat "ABCD")

f :: Int -> [(Char,Int)]
f n = (,) <$> (chars !! n) <*> [1..3]

g :: Int -> [[(Char,Int)]]
g 1 = (\a     -> [a    ]) <$> (f 1)
g 2 = (\a b   -> [a,b  ]) <$> (f 1) <*> (f 2)
g 3 = (\a b c -> [a,b,c]) <$> (f 1) <*> (f 2) <*> (f 3)
-- g n = (\x1 x2 ... …
Run Code Online (Sandbox Code Playgroud)

monads haskell list-comprehension list functor

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

将(a1,b1)和(a2,b2)映射到(a1 + a2,b1 + b2)

我记得这是非常基本的,可以简单地通过模式匹配来完成,即使是像lambda一样(\a b -> (fst a + fst b, snd a + snd b) ) (1,2) (3,4).但是,我认为应该有Haskell标准库提供的方法来做这样的事情.的定义mappend(a,b)类型幺看起来颇为相似.但是执行以下操作不起作用:

(1,2) `mappend` (3,4)
Run Code Online (Sandbox Code Playgroud)

任何Haskell添加两个2元组的方式?

monads haskell applicative monoids

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

'eval :: String - >(a - > b)'字符串到函数转换器

有在Haskell标准库中的函数(或一些其他模块/包),可以采取一个String字面如"+","head"等等,然后把这些成其相应的Haskell功能,诸如+,head

Hoogle没有产生任何立即有用的答案.这样一个函数的虚拟示例将如下所示:

eval :: String -> (a -> b)
eval "+" = (+)
eval "head" = head
Run Code Online (Sandbox Code Playgroud)

ps假设这里的"对应"可以表示不同上下文中的不同事物(+可能不再被定义为非Numbers 类型的数字加法)但是回答这个问题是必要的,让我们假设字符串的"对应"函数是类型检查的函数,可以在将字符串转换为此函数的环境中进行求值,也就是使用词法作用域来查找此函数的值.

如果没有这样的功能,是否有深层原因(例如来自lambda演算,类型理论等)为什么,并且不可能在任何严格的静态类型语言中实现?如果在Haskell中不可能,对于这样的问题,实际上建议的做法是什么?想象一下,实现一个线性代数库,其中字符串或者eval到创建值vect2的函数(例如,是一个创建二维函数的函数),或者(二进制,为了简单)操作,从它们映射到其他类型(我们可以选择提供类型)这些注释,例如eval "innerProduct" :: Double,eval "matrixProduct" :: Matrix等)

更一般地说,一种String类型有一种*,但一种功能->有一种* -> * -> *.假设我们可以*从词法范围中提供前两种,那么应该是可能的,对吧?

parsing haskell functional-programming eval

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