【发布时间】:2013-11-29 23:53:39
【问题描述】:
考虑有一个包含 3 个数字的列表,其中每个数字指定位置的变化,并且它们的值变化如下:
x 从 0 开始,然后增加 1 直到 9,然后 y 做同样的事情,然后 z 做同样的事情。当它们全部为 9 时,它们将重置为零。
我已经写了以下内容:
ShiftInX :: ShiftBy->ShiftBy
ShiftInX [z,y,9] = ShiftInY [z,y,0]
ShiftInX [z,y,x] = [z,y,x+1]
ShiftInY :: ShiftBy->ShiftBy
ShiftInY [z,9,0] = ShiftInZ [z,0,0]
ShiftInY [z,y,0] = [z,y+1,0]
ShiftInZ :: ShiftBy->ShiftBy
ShiftInZ [9,0,0] = [0,0,0]
ShiftInZ [z,0,0] = [z+1,0,0]
另外,还有 3 个字符串:
s1 = "ahsgtdfyu"
s2 = "kfhyrdncl"
s3 = "polsedrtd"
给定一个字符串,我想获取给定字符串的每个字符,在 s3 中找到它,将其移动 x,获取该字母并在 s2 中找到它,将其移动 y,获取该字母并在 s3 中找到它并将其移动 z 并重新输入字符。 对给定字符串的每个字符执行相同的操作。在处理每个字符之前,ShiftBy 列表会按照开头所述进行更改。
我编写了一个函数,它获取一个字符和一个 shiftBy 列表作为输入并返回一个字符作为输出。它找到如上所述的输出字符。 findChar :: String -> Char -> [Int] -> Char
问题:我希望能够为给定字符串的每个字符调用此函数,但不会丢失 shiftBy 数字的值,以便每个新字符的 shiftBy 数字都会增加。 processString :: String -> [Int] -> String
我为此使用了 map,但是在处理每个字符后,这些值都会丢失。
我被告知我必须为此使用折叠或显式递归。我了解 fold 的作用,但不知道如何在这里使用它。有人可以帮忙吗?
非常感谢
【问题讨论】:
标签: haskell