mac*_*ian 4 haskell programming-languages equals guard
我有以下问题(Haskell - 函数式编程工艺):
给出函数的定义
howManyEqua1 :: Int -> Int -> Int -> Int
Run Code Online (Sandbox Code Playgroud)
它返回三个参数中有多少相等,所以
howManyEqua1 :: 34 25 36 = 0
howManyEqual :: 34 25 34 = 2
howManyEqual :: 34 34 34 = 3
Run Code Online (Sandbox Code Playgroud)
我给出的答案是:
howManyEqual :: Int -> Int -> Int -> Int
howManyEqual a b c
| a == b && b == c = 3
| a == b = 2
| b == c = 2
| a == c = 2
| otherwise = 0
Run Code Online (Sandbox Code Playgroud)
但是,我相信有一种更好的方法可以对它进行分类,但我不确定如何进行分类.
怎么样:
howManyEqual a b c
| a == b && b == c = 3
| a /= b && a /= c && b /= c = 0
| otherwise = 2
Run Code Online (Sandbox Code Playgroud)
要么:
howManyEqual a b c = case length.nub $ [a,b,c] of
1 -> 3
2 -> 2
3 -> 0
Run Code Online (Sandbox Code Playgroud)
更新:
使用ryaner的答案作为起点和luqui的泛化定义,我们也可以使用这一个衬里并且具有O(n log n)复杂度的通用解决方案:
howManyEqualG = sum.filter (>1).map length.group.sort
-- Now, specialized to three:
howManyEqual a b c = howManyEqualG [a,b,c]
Run Code Online (Sandbox Code Playgroud)