So, I just encountered a most delicious type the other day:
class Finite a where assemble :: Applicative f => (a -> f b) -> f (a -> b)
What's so nice about it is that the only way you can implement it is if the type
a is in fact finite. (But see the notes.) So the questions are:
- Can you see why?
- Can you figure out how to implement it for some chosen finite type?
- Can you figure out how to implement it in general, given a list of all the values? (you may assume
Eq afor this one)
- Can you figure out how to get a list of all the values, given some arbitrary implementation of