gpt4 book ai didi

function - Haskell 运行时错误 : error: Prelude. (!!):索引太大

转载 作者:行者123 更新时间:2023-12-02 05:43:01 25 4
gpt4 key购买 nike

我在 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

我一直在做研究,但没有找到任何解决这个特定错误的方法。如果有人对此有所了解,我将不胜感激。

(顺便说一句,错误中的“索引”与我在函数中使用的索引不同)

最佳答案

依靠!!因为此任务表明您正在尝试将不同的语言硬塞到 Haskell 中。请允许我向您指出一个更 Haskelly 的解决方案。据我了解,此函数执行标准字符串相等测试,但允许第一个字符串具有字符 $ ,这是一个可以匹配任何单个字符的“通配符”。

回想一下 String在 Haskell 中只不过是 Char 的列表.因此,我们可以在两个列表构造函数上进行模式匹配:空列表和非空列表。匹配两个列表的两种可能性为我们提供了四种可能的组合:

(#==#) :: String -> String -> Bool
[] #==# [] = ???
(x:xs) #==# [] = ???
[] #==# (y:ys) = ???
(x:xs) #==# (y:ys) = ???

考虑两个列表是否为空。他们匹配吗?可以肯定地说,他们确实如此。事实证明这是一个重要的基本情况选择,但现在我只是呼吁将空字符串放入原始代码应该产生 True 的事实。 .
[] #==# [] = True

让我们看看中间的两种情况,一种是空的,另一种不是。
(x:xs) #==# []     = ???
[] #==# (y:ys) = ???

您从未指定长度不均匀的列表应该发生什么。但是,为了保留您的原始算法,如果第一个列表填充了 $那么我们称它为好,否则,它不是一个匹配项。因此,我们将检查左侧列表的第一个元素,如果它是 $然后我们将继续检查列表的其余部分。
('$':xs) #==# []    = xs #==# []
(x:xs) #==# [] = False
[] #==# (_:_) = False

让我们看一个有趣的案例,两者都是非空的。
(x:xs) #==# (y:ys) = ???

如果左边第一个字符是 $ , 然后我们忽略任何正确的字符,并继续检查。如果绑定(bind)到 x 的字符和 y是相等的,然后,我们继续检查。如果它们不相等,那么我们以 False 停止。 .
('$':xs) #==# (_:ys) = xs #==# ys
(x:xs) #==# (y:ys)
| x == y = undefined {- exercise to the reader -}
| otherwise = False

该技术使用原始递归,而不是列表推导。如果这对您来说似乎很陌生,那么我强烈建议您查看 LYAH > Recursion了解 Haskell 方式的一个很好的介绍。

关于function - Haskell 运行时错误 : error: Prelude. (!!):索引太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com