2011-12-04 85 views
3

我想編寫一個函數來生成一個字符串。該字符串只包含1,0,s和S. 這些數字是二進制數字。每個數字通過s分隔。一個數字給出了字符串其餘部分的長度。大寫S是字符串的結尾。函數在Haskell中生成一個字符串

例子:

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

+3

它是功課嗎? –

+0

是的,是的。所以我想我可以得到一些提示。感謝您的幫助。 :) – Alexei

+0

@Alexei該代碼is.pretty一個初學者沒關係。嘗試使用地圖!這真的可以節省你的工作。 – fuz

回答

2

我認爲你是從錯誤的角度解決您的問題。在Haskell中,人們經常會想到列表。實際上,String只是一個Char的列表。嘗試從這些磚建立你的功能:

  • 寫一個函數toBinary :: Integral a => a -> [Bool]輸出其參數的二進制表示。一個1True0False
  • 可以使用map由字符01替換每個布爾打開[Bool]String
  • 您可以使用語法[1..n]生成從1n的整數列表。使用map生成二進制表示字符串的列表。
  • 使用intercalateData.List創建您的字符串。
+0

我可以發佈我的代碼嗎? – Alexei

+0

@Alexei您可以[編輯](http://stackoverflow.com/posts/8378281/edit)您的原始問題,幷包括您的代碼。 (在每行上預留四個空格用於語法高亮顯示)。您也可以使用http://hpaste.org等pastebin – fuz

0

由於尾部遞歸定義(例如:「尾巴」的(F 4)是(F 3)),則可以通過首先獲得尾得到尾部的長度:

let the_tail = f (n-1) in 

然後調用它的長度功能

length the_tail