我想编写一个生成String的函数。字符串仅包含1,0,s和S. 数字是二进制数。每个数字都通过s分隔。并且数字给出了String的其余部分的长度。大写字母S是字符串的结尾。
示例:
func :: Integral a => a -> String
func 1
"1S"
func 3
"110s11s1S"
func 4
"1010s110s11s1S"
我的问题是,我不知道,我如何得到尾巴的长度("s1S" -> tail
,11 -> head
)而不是获得新尾巴。
我的新代码:
>toBinary :: Integral a => a -> String
>toBinary 0 = []
>toBinary x
> | mod x 2 == 0 = '0' : toBinary (div x 2)
> | mod x 2 == 1 = '1' : toBinary (div x 2)
>zubinaer :: Integral a => a -> String
>zubinaer x = reverse (toBinary x)
>
>distan :: Integral a => a -> String
>distan n = if n > 0 then hilfsfunktion (n-1) "1S" else []
>
> where
> hilfsfunktion :: Integral a => a -> String -> String
> hilfsfunktion 0 s = s
> hilfsfunktion n s = hilfsfunktion (n-1) (zubinaer(length s + 1) ++ "s" ++ s )
这是我的旧代码:http://hpaste.org/54863
答案 0 :(得分:2)
我认为你是从错误的角度解决你的问题。在Haskell中,人们常常想到列表。实际上,String
只是Char
的列表。尝试从这些砖块构建您的功能:
toBinary :: Integral a => a -> [Bool]
,输出其参数的二进制表示。 1
为True
,0
为False
map
将[Bool]
变为String
,方法是将每个布尔值替换为字符0
或1
。[1..n]
生成从1
到n
的整数列表。使用map
生成二进制表示字符串列表。intercalate
中的Data.List
创建字符串。答案 1 :(得分:0)
由于尾部是递归定义的(例如:(f 4)的“尾部”是(f 3)),你可以通过首先得到尾部来获得尾部的长度:
let the_tail = f (n-1) in
然后调用长度函数
length the_tail