If you want readability, you might want to consider named members. This has two advantages:
- It is clear what each field is for
- Haskell automatically derives access functions, function name is the same as the field name
Then the code looks like this:
data Token = Token {name:: String, age::Int} deriving ( Show )
data Person = Person {token::Token} deriving ( Show )
main = do
let person = Person $ Token "Joe" 39
print $ name $ token person
[EDIT]
As to whether, in general, it is worth putting in signatures for very simple functions - this is very subjective.
Not putting in signatures saves typing, and can reduce the length of simple functions on the screen. Haskell can derive the signatures automatically.
If you are using Visual Studio Code and HLS, HLS will suggest a signature, and you can accept what it offers. The way HLS is set up on my computer, if there isn't a signature provided it will offer one, and so there is no saving on function length.
I would personally include function signatures because that's my style, such as it is. If the getters are stacked up one after the other with comments as to what it does, you might decide to not do so.