gpt4 book ai didi

list - Haskell中的子字符串

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

我应该拆分一个字符串并返回出现在传递字符之前的子字符串,但我们刚刚启动 Haskell,它对我来说就像中文。我一直在搞砸它,但没有运气。这是我目前所拥有的:

--spanString returns substring of string s before char c
spanString (c, [s])::(c, [s]) -> []
spanString (c, a:b) =
let (x, y) = spanString (c, b)
in
if a < c then (a:x,y)
else (x, a:y)

我在搞砸什么?

最佳答案

首先,你的类型签名完全搞砸了。它必须不存在或采用 spanString :: <some type> 形式.即使我们忽略 (c, [s])站在双冒号前,剩下的还是有些奇怪。可以将其理解为“一个函数,将 (c, [s]) 类型的值转换为 [] 类型的值,用于任何 c 和 s”(c 和 s 是类型变量)。一、没有类型[]在 haskell 。没有元素类型就没有列表类型。接下来,我们不能使用任何 cs .我们必须能够比较它们,对吧?

实际上,让我们暂时避免使用多态性并准确指定我们想要的类型。我们想要一个字符和一个字符列表,出于某种原因打包成一个元组:(Char, [Char]) .请注意 Char以大写字母开头,表示它不是类型变量,而是具体类型。我们的结果类型呢?如果您相信问题描述,则需要返回一个字符列表( [Char] ),但如果您查看代码,它显然会返回列表元组( ([Char], [Char]) )。好吧,也许第二个列表很有用,我们先不管它:

spanString :: (Char, [Char]) -> ([Char], [Char])`

现在您的代码可以编译了。

但是,在运行时,它会崩溃并出现异常:Non-exhaustive patterns in function spanString .这是因为当传递的列表为空时,您不处理这种情况。如果你这样做,通过添加一个等式

spanString (_, []) = ([], [])

,你的函数运行良好,但现在让我们看看它做了什么。原来你有一个列表分区函数:它返回给定字符串中小于c的所有字符。作为元组的第一个元素,所有其他字符作为第二个元素。对我来说似乎是一个错误(你实现了一个完全不同的功能!)。

关于list - Haskell中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844201/

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