'Calculate length of custom data
I'm learning Haskell one day at a time. At this time, I'd like to capture the size of a custom data to process it further. Say I have:
data LetterAlphabet = L1 | L2 | L3 | L4 deriving (Show,Enum,Bounded)
fun :: (Bounded a, Enum a) => a -> Int
fun a = 1 + fromEnum (maxBound :: LetterAlphabet)
It works but I had to indicated the data type explicitly. I tried to use (maxBound :: typeof a) and similars, with no success.
Solution 1:[1]
You can work with a trick by using asTypeOf :: a -> a -> a which returns the first item but forces that the item is of the same type as the second parameter, so:
fun :: (Bounded a, Enum a) => a -> Int
fun a = 1 + fromEnum (asTypeOf maxBound a)
But a more elegant way is to work with the TypeApplications extension:
{-# LANGUAGE AllowAmbiguousTypes, ScopedTypeVariables, TypeApplications #-}
fun :: forall a . (Bounded a, Enum a) => Int
fun = 1 + fromEnum (maxBound @a)
Then this can be used as fun @LetterAlphabet). We thus only specify the type, we do not pass a variable of that type.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Willem Van Onsem |
