string - 插入从给定索引开始的字符串
问题描述
我对 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
是长度,m
是p
开始添加新字符串的索引
输出:
*Main> t = create
*Main> t
("",0,0,"","")
*Main> t = addText t "test"
*Main> t
(hangs)
解决方案
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,"","")
推荐阅读
- java - 通过继承在java中访问具有父类实例的子类成员
- javascript - Tablesorter:如何按日本天数排序?
- android - 如何使用带有参数的 Kotlin 创建单例?
- python-3.x - 无人驾驶 AI:未创建 Python 管道
- performance - Liferay 文档和媒体限制
- symfony - Api-Platform IriConverter Symfony 上下文
- ffmpeg - ffmpeg 将 rgba 拆分为 rgb 和 a 并在输出视频中将它们彼此相邻添加
- c# - 动态 LINQ 子查询
- java - java - 如何在java dynamodb查询中从AttributeValue Map获取多个值?
- svn - Subversion over HTTP,哪个命令导致以下请求?