Haskell中的子字符串替换问题

Haskell中的子字符串替换问题,haskell,Haskell,我遇到了一个奇怪的问题,用Haskell编写了一个小函数,它用来遍历一个字符串并用另一个单词替换其中的一个单词。当使用小字符串时,该函数起作用,但当搜索大字符串以替换单词时,会发生奇怪的事情。该函数定义如下: swapwords :: String -> String -> String -> String swapwords w1 w2 [] = [] swapwords w1 w2 (x:xs) | length (x:xs) < n = (x:xs)

我遇到了一个奇怪的问题,用Haskell编写了一个小函数,它用来遍历一个字符串并用另一个单词替换其中的一个单词。当使用小字符串时,该函数起作用,但当搜索大字符串以替换单词时,会发生奇怪的事情。该函数定义如下:

swapwords :: String -> String -> String -> String
swapwords w1 w2 [] = []
swapwords w1 w2 (x:xs)
    | length (x:xs) < n = (x:xs)
    | otherwise = do     
    if w1 == take n (x:xs) then w2 ++ swapwords w1 w2 (drop n (x:xs))
        else x:swapwords w1 w2 xs
    where n = length w1 
swapwords::String->String->String->String
swapwords w1 w2[]=[]
swapwords w1 w2(x:xs)
|长度(x:xs)
当使用交换字“ab”“ba”“ab”运行时,输出正确为“ba”,但是当使用输入“lamb”“buffalo”“Mary有一只小羊羔,它的羊毛像雪一样白”运行时,输出仍然正确地将“lamb”与“buffalo”交换,但是添加到字符串末尾的是加载WinHugs时首次显示的消息的一部分,例如玛丽有一只小水牛,它的羊毛像雪一样白-98,可以用来进行赎罪

类型:?“求救”


作为对Haskell的一个相对通知,我不知道为什么会发生这种情况,如果能提供任何关于为什么会发生这种情况的信息,我将不胜感激。

我在GHCi中运行了您的代码,并且工作得非常完美。可能是WinHugs中的一个bug


你应该考虑迁移到GHC。WiHug在几年内没有更新。

提交一个bug报告给HUG,它正确地在<代码> GHC/<代码> >你可以逐个张贴HUG会话吗?我发现输出字符串不太可能是错误的,我认为它可能是I/O缓冲问题或某事。检查的一种方式是测试<代码> LeN。gth
的输出,看看它是否是您期望的长度。感谢您的评论,我将提交一份错误报告,并在GHCi中使用GHCRan it进行交换,它对该输入工作正常,并推广到
Eq a=>[a]->[a]->[a]->[a]->[a]
,它适用于
交换字[1,2,3][3,5,4,3,2,1,2,2,2,3,3,4,5]
。听起来像是WinHugs的问题