String 只有一个字符不同的字符串

String 只有一个字符不同的字符串,string,haskell,String,Haskell,所以,我对Haskell(以及一般的编程)有点陌生,我一直在尝试解决一个问题。我想做一个函数,它有两个字母数字(字符串类型)作为输入,并且只有当两个字母数字长度相同且只有一个不同的字符时才返回True。例如,如果输入是block和block,我会得到True,但是如果输入是block和brake,我会得到false。我试图用递归来实现这一点,但失败得很惨。我需要这个函数,因为我想用它来检查我正在处理的程序中的一些输入 非常感谢您的帮助,谢谢您的时间。如果我没弄错的话,不同的字符应该出现在同一个位

所以,我对Haskell(以及一般的编程)有点陌生,我一直在尝试解决一个问题。我想做一个函数,它有两个字母数字(字符串类型)作为输入,并且只有当两个字母数字长度相同且只有一个不同的字符时才返回True。例如,如果输入是block和block,我会得到True,但是如果输入是block和brake,我会得到false。我试图用递归来实现这一点,但失败得很惨。我需要这个函数,因为我想用它来检查我正在处理的程序中的一些输入


非常感谢您的帮助,谢谢您的时间。

如果我没弄错的话,不同的
字符应该出现在同一个位置上

那么我认为一个直截了当的定义是:

oneDifferent xs ys = 
   length xs == length ys && 
   1 == length (filter (==False) (zipWith (==) xs ys))
。。。或者

oneDifferent xs ys = 
  length xs == length ys &&  
  1 == foldr ((+) . fromEnum) 0 (zipWith (/=) xs ys) where
递归解决方案是

oneDifferent (x:xs) (y:ys) 
  | x /= y = xs == ys
  | otherwise = oneDifferent xs ys 
oneDifferent _ _ = False   

是的,我想要同样的职位。感谢递归解决方案,你帮助了我陷入困境的大脑。如果可能的话,在编写列表函数时避免
长度
通常是个好主意。例如,你的前两个解决方案将挂在两个无限列表上,即使你能马上看出它们是不同的!我特别喜欢第一个。