字符串只有一个字符

use*_*812 3 string haskell

所以,我对Haskell(以及一般的编程)有点新意,我一直试图解决问题.我想创建一个函数,它有一个输入2个字母数字(类型字符串),只有两个字母数字长度相同且只有1个不同的字符时才返回True.所以,例如,如果输入是块和黑色,我会得到真,但如果输入是黑色和刹车,我会得到假.我尝试用递归来做这件事,但我失败了.我需要这个函数,因为我想用它来检查我正在处理的程序中的一些输入.

任何帮助表示赞赏,谢谢你的时间.

Lan*_*dei 10

如果我理解你,那么不同的Chars应该出现在同一个位置上?

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

oneDifferent xs ys = 
   length xs == length ys && 
   1 == length (filter (==False) (zipWith (==) xs ys))
Run Code Online (Sandbox Code Playgroud)

... 要么 ...

oneDifferent xs ys = 
  length xs == length ys &&  
  1 == foldr ((+) . fromEnum) 0 (zipWith (/=) xs ys) where
Run Code Online (Sandbox Code Playgroud)

递归解决方案将是

oneDifferent (x:xs) (y:ys) 
  | x /= y = xs == ys
  | otherwise = oneDifferent xs ys 
oneDifferent _ _ = False   
Run Code Online (Sandbox Code Playgroud)

  • 在可能的情况下,在编写列表函数时避免使用`length`通常是一个好主意.例如,前两个解决方案将挂在两个无限列表中,即使您可以立即知道它们是不同的. (2认同)