我正在尝试加密将字符串“ 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”
答案 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