Haskell - 函数式编程工艺(练习4.3)

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)

但是,我相信有一种更好的方法可以对它进行分类,但我不确定如何进行分类.

Sea*_*ean 7

怎么样:

howManyEqual a b c
    | a == b && b == c           = 3
    | a /= b && a /= c && b /= c = 0
    | otherwise                  = 2
Run Code Online (Sandbox Code Playgroud)


JKn*_*ght 5

要么:

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)