首页 > 解决方案 > 插入从给定索引开始的字符串

问题描述

我对 Haskell 完全陌生。我需要在可能已经非空的字符串的给定索引处插入给定的字符串。

这就是我到目前为止所拥有的。但是,在看似没有错误运行之后,当我问什么t是 ghci 的值时,它会无限期地挂起。

哈斯克尔:

create = ("",0,0,"","")

addText (m,l,p,_,k) i = 
    let a = take p m
        m = drop p m
        full = a++i++m
    in (full, length full, p + length i, "", k)

m要添加的文本在哪里,l是长度,mp开始添加新字符串的索引

输出:

*Main> t = create

*Main> t

("",0,0,"","")

*Main> t = addText t "test"

*Main> t

(hangs)

标签: stringhaskellghci

解决方案


let m = drop p m

是一个循环定义。这并不意味着“设置m为小于m以前的值”,因为请记住,在 Haskell 中无法修改变量。相反,您忽略现有的m,并定义一个名为 的新变量m,根据自身定义:一个永远无法完成的评估。这似乎是一个愚蠢的功能,但在其他情况下,根据它们本身定义值实际上非常有用,这就是语言允许它的原因。

然后你又犯了同样的错误,

t = addText t "test"

根据自身定义t

您可以通过使用唯一命名的变量来修复这两个错误,例如

r = addText t "test"

此时您将遇到令人兴奋的新错误:由于类型默认规则,create推断的类型签名与推断的类型签名不匹配。addText如果你指定明确的类型签名,或者内联 的定义create,你最终会得到你想要的:

*Main> addText ("",0,0,"","") "test"
("test",4,4,"","")

推荐阅读