我在 Haskell 中有一个冗长且有点古怪的函数。
(#==#) :: String -> String -> Bool
str1 #==# str2 = (sum[ 1 | index <- [0..(max (length str1) (length str2))], (str1!!index == str2!!index || str1!!index == '$')] == (max (length str1) (length str2)))
简而言之,此函数检查两个字符串是否相同,如果它们有一个或多个“$”,则认为它们 相同从 0 到最长字符串的长度。然后将当前索引处的每个字符串的元素与彼此或美元符号进行比较。两者都可以。如果它们是其中之一,则将 1 添加到新列表中,并且如果此新列表的总和等于长度,则该单词是匹配的。
但是,当我尝试运行它时,出现了一个特殊的错误:
*Practice> let totals = (sum[ 1 | index <- [1..(max (length str1) (length str2))], (str1!!index == str2!!index || str1!!index == '$')] == (max (length str1) (length str2)))
*Practice> totals
*** Exception: Prelude.(!!): index too large
我一直在做研究,但没有找到任何解决这个特定错误的方法。如果有人对此有所了解,我将不胜感激。
(顺便说一句,错误中的“索引”与我在函数中使用的索引不同)