Haskell Rewriting Min Class

2019-09-19 16:32发布

问题:

I'm quite new to Haskell and I'm writing a function that is similar to min instead of just accepting 2 values it'll accept 3. I've worked out the class as shown here:

min3 :: a -> a -> a -> a

However what would I put with the function itself after writing how many input variables?

min3 x y z = 

This is probably stupidly easy and I'm missing something but if you could please help me out I would really appreciate it.

Thanks!

回答1:

One implementation

min3 :: Ord a => a -> a -> a -> a
min3 x y z = min x $ min y z

Notes:

  • In the type definition you have to write Ord a => ... because your arguments shall be ordable, i.e. the min function has to be defined for them.

@Lee provides a point free implementation which also can be written as

import Data.Composition ((.:))

min3 :: Ord a => a -> a -> a -> a
min3 =  min .: min

Note: f .: g is a shortcut for (f .) . g which is defined in Data.Composition



回答2:

You can also write it as:

min3 :: Ord a => a -> a -> a -> a
min3 = ((min .) .) min


回答3:

Another implementation:

min3 x y z = head $ sort [x,y,z]

And this could be easily generated to a function that can find the minimum in a list:

minimum = head . sort

Data.List gives a different implementation of minimum.