String 只有一个字符不同的字符串
所以,我对Haskell(以及一般的编程)有点陌生,我一直在尝试解决一个问题。我想做一个函数,它有两个字母数字(字符串类型)作为输入,并且只有当两个字母数字长度相同且只有一个不同的字符时才返回True。例如,如果输入是block和block,我会得到True,但是如果输入是block和brake,我会得到false。我试图用递归来实现这一点,但失败得很惨。我需要这个函数,因为我想用它来检查我正在处理的程序中的一些输入String 只有一个字符不同的字符串,string,haskell,String,Haskell,所以,我对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
是的,我想要同样的职位。感谢递归解决方案,你帮助了我陷入困境的大脑。如果可能的话,在编写列表函数时避免长度通常是个好主意。例如,你的前两个解决方案将挂在两个无限列表上,即使你能马上看出它们是不同的!我特别喜欢第一个。