如何实现运行长度编码模数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 中实现了这个,但它看起来太冗长而且读起来很糟糕。关键思想是一次检查三个元组,如果我们既不能取消0元组也不能在手头的三个元组中合并一对元组,则只向前推进一个元组。
import Data.List (group)
test = [('A', 1), ('A', 2), ('B', 2), ('B', …Run Code Online (Sandbox Code Playgroud) 为关联数组实现函子实例(本质上是一个映射操作)似乎很简单(例如参见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
考虑以下程序。
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) 我记得这是非常基本的,可以简单地通过模式匹配来完成,即使是像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元组的方式?
有在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类型有一种*,但一种功能->有一种* -> * -> *.假设我们可以*从词法范围中提供前两种,那么应该是可能的,对吧?
haskell ×5
list ×2
monads ×2
algorithm ×1
applicative ×1
compression ×1
eval ×1
functor ×1
monoids ×1
parsing ×1