2

我正在尝试查找字符串列表中的任何字符串中是否已使用某些字母。如果是 - 选择下一个字母进行比较。如果否 - 返回这封信并更新初始列表。

要签入我正在使用的列表:

check:: [String] -> Char -> Char
check s c 
    | any (elem c) s = check s (next c)
    | otherwise = do update s c 
                     return c

但这给了我一个错误:

无法将类型 '[Char]' 与 'Char' 匹配
预期类型:[String] -> [Char] -> Char
实际类型:[String] -> [Char] -> [Char]
在 ' stmt 中做'块:更新sc

我的更新函数有以下声明:

update:: [String] -> Char -> [String]

有没有正确的方法在警卫中执行 2 个动作otherwise?我需要返回c以便在另一个递归函数中使用它,该函数将Char c和 updated [String] s作为参数

当我让这个函数只返回c而不更新列表时,没有错误:

check:: [String] -> Char -> Char
check s c 
    | any (elem c) s = check s (next c)
    | otherwise = c

欢迎任何提示。

更新:我的下一个功能是:

next :: Char -> Char
next 'Z' = 'A'
next c = chr (ord c + 1)

对于更新,我尝试过:

update:: [String] -> Char -> [String]
update s c = s ++ [[c]]

问题是,稍后,我需要使用[String]which 是更新的结果,以及Char c(检查结果)到另一个函数中。这就是为什么在执行检查后,我需要返回一个值,并用它更新一个列表。

4

1 回答 1

1

Haskell 是一种函数式语言,因此您不能(不应该)考虑改变数据结构,而是一个函数应该返回该数据结构的更新版本,以及您需要的任何其他内容。最常见的方法是返回一个你需要的值的元组。以下是您可能正在寻找的内容:

check:: [String] -> Char -> (Char, [String])
check s c 
    | any (elem c) s = check s (next c)
    | otherwise = (c, s ++ [[c]])

这样你就得到了“这个”字母和 Strings 初始列表的更新版本。

于 2016-04-11T06:58:21.220 回答