如何在Haskell中将数字作为字符串添加到字符串

时间:2019-06-26 20:21:42

标签: haskell

我正在尝试加密将字符串“ aaaabbccdeee”转换为“ a4bbccde3”

我无法让它在一个功能中工作

工作解决方案1:

<View style={styles.webview}>
     <MathJax style={styles.formula_img} html={"<p>$$S=(sqrt(3)*a^2)/4$$</p>"}
          mathJaxOptions={{
               messageStyle: 'none',
           jax: [ 'input/AsciiMath', 'output/SVG' ],
           extensions: ["asciimath2jax.js"],
           asciimath2jax: {
            delimiters: [['$','$'], ['$$','$$']]
            },
           processEscapes: true,}}
     /> 
</View>

解决方案2无效:

import Data.List (group)
gab0 :: [Char] -> [(Char, Int)]
gab0 = map(\l@(x:xs) -> (x, length l)) . group

gab1 :: (Char, Int) -> String
gab1 (d, 1) = [d]
gab1 (d, 2) = [d] ++ [d]
gab1 (d, x) = [d] ++ show x


gab :: [(Char, Int)] -> String
gab = foldr(\x acc ->  gab1 x ++ acc) [] 

{-
 - gab $ gab0 ['a', 'a', 'a', 'b', 'c', 'c','c','c','d','e','e']
"a3bc4de2"
-}

“ aaaabbccdeee”转换为“ a4bbccde3”

2 个答案:

答案 0 :(得分:4)

听起来像您正在尝试将第一个定义压缩为一个函数-也就是说,您只需要随机整理一些工作代码即可。 Haskell在这方面很棒。

我个人将gab1分开,因为它有几种特殊情况。通常会以咖喱的形式写

gab1 :: Char -> Int -> String
gab1 d 1 = [d]
gab1 d 2 = [d,d]
gad1 d x = [d] ++ show x

gab0建立(Char,Int)对时,唯一用于的目的是稍后传递给gab1。这样我们就可以融合该层了:

gab0 :: String -> [String]
gab0 = map (\l@(x:_) -> gab1 x (length l)) . group

现在,由于我们已经将gab1的应用程序移至gab0(这些都需要更好的名称,是吗?),gab已简化为:

gab :: [String] -> String
gab = foldr (\x acc -> x ++ acc) [] 
    = foldr (++) []
    = concat

(我使用链接的=来表示一行中的多个缩减-在实际代码中,您需要选择一个,但它们都是等效的。)

由于gab非常简单,为什么我们不只是将其作为gab0的一部分呢?

gab0 :: String -> String
gab0 = concat . map (\l@(x:_) -> gab1 x (length l)) . group

我们可以将gab1移到where子句中,因为它仅用于有限范围。我将其重命名为renderRun,因为它将“运行”转换为字符串。

gab0 :: String -> String
gab0 = concat . map (\l@(x:_) -> renderRun x (length l)) . group
    where
    renderRun d 1 = [d]
    renderRun d 2 = [d,d]
    renderRun d x = [d] ++ show x

您还喜欢吗?

答案 1 :(得分:2)

您快到了,解决方案很好,sub Tasks / sub Functions对程序员来说很健康,所以,不用担心,您可以通过编写它们来创建另一个额外的函数:

gab2 :: [(Char, Int)] -> String
gab2 = foldr(\x acc ->  gab1 x ++ acc) []

finalGab :: [Char] -> String
finalGab = gab2 . gab0