在Haskell中生成String的函数

时间:2011-12-04 20:15:34

标签: haskell

我想编写一个生成String的函数。字符串仅包含1,0,s和S. 数字是二进制数。每个数字都通过s分隔。并且数字给出了String的其余部分的长度。大写字母S是字符串的结尾。

示例:

func :: Integral a => a -> String

func 1

"1S"

func 3

"110s11s1S"

func 4

"1010s110s11s1S"

我的问题是,我不知道,我如何得到尾巴的长度("s1S" -> tail11 -> 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

2 个答案:

答案 0 :(得分:2)

我认为你是从错误的角度解决你的问题。在Haskell中,人们常常想到列表。实际上,String只是Char的列表。尝试从这些砖块构建您的功能:

  • 编写一个函数toBinary :: Integral a => a -> [Bool],输出其参数的二进制表示。 1True0False
  • 您可以使用map[Bool]变为String,方法是将每个布尔值替换为字符01
  • 您可以使用语法[1..n]生成从1n的整数列表。使用map生成二进制表示字符串列表。
  • 使用intercalate中的Data.List创建字符串。

答案 1 :(得分:0)

由于尾​​部是递归定义的(例如:(f 4)的“尾部”是(f 3)),你可以通过首先得到尾部来获得尾部的长度:

let the_tail = f (n-1) in

然后调用长度函数

length the_tail