给一个字符串,我需要一个函数,它返回一个字符串列表,它通过用字母表中的每个小字母替换原始字符串中的每个字符而形成。例如"car"
- > ["aar","bar","dar",....,"cbr","ccr",...]
。
我试过这个:
replaced1 :: String -> [String]
replaced1 [] = []
replaced1 (x:xs) = [h ['a'..'z'] : map (x:) (replaced1 xs)
where h[] = []
h c= head c (h(tail c))
但它在where
处给出了一个解析错误。我刚学习Haskell,所以我不习惯这种错误。我怎么解决这个问题?
答案 0 :(得分:1)
一些事情。首先,看起来你正在考虑使用[h ['a'..'z']...
列表理解你试图用系列['a' .. 'z']
中的每个字符替换字符串的第一个字符。其语法为[h c | c <- ['a'..'z']]
。如果您需要澄清或者这不是您的想法,请在评论中提出(或修改您的帖子)。
其次,h
的类型应为Char -> String
。它需要替换字符,然后将输入的其余部分用于replaced1
(即xs
)。
第三,对于组合列表,使用(++)
而非:
。 map (x:) (replaced1 xs)
的类型为[String]
,但您要将其添加到的类型也是如此。
这是固定版本,还有一点可以填写。
replaced1 :: String -> [String]
replaced1 [] = []
replaced1 (x:xs) = [h c | c <- ['a'..'z']] ++ map (x:) (replaced1 xs)
where h :: Char -> String
h c = {- left as exercise -}