【问题标题】:function that generates a String in Haskell在 Haskell 中生成字符串的函数
【发布时间】:2012-01-12 18:40:41
【问题描述】:

我想编写一个生成字符串的函数。该字符串仅包含 1,0,s 和 S。 数字是二进制数。每个数字通过 s 分隔。一个数字给出了字符串其余部分的长度。大写的 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

【问题讨论】:

  • 是的。所以我想我可以得到一些提示。感谢您的帮助。 :)
  • @Alexei 该代码对初学者来说还不错。尝试使用地图!它确实可以节省您的工作量。

标签: haskell


【解决方案1】:

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

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

【讨论】:

  • @Alexei 您可以edit 您的原始问题并包含您的代码。 (在每行前加四个空格以突出显示语法)。您还可以使用诸如hpaste.org 之类的 pastebin
【解决方案2】:

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

let the_tail = f (n-1) in

然后调用长度函数就可以了

length the_tail

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 2014-02-16
    • 2016-03-17
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多