How Do You Read Types?

Still plugging away and trying to grasp the concepts here. I love it, and I am committed now, but just wanted to stop and ask everyone something pretty general — How you do read the types? As in, what words go through your head in your attempt to translate these things.

A good example for me is the definition for the pipe operator and backwards func operator.

(<|) : (a → b) → a → b
&
(|>) : a → (a → b) → b

I get the idea, and have a good understanding of how they work, but when I try to just explain these type definitions I cannot really do it. Just wondering how people with more experience read these things. Thought maybe it will unlock something trapped in my brain or something.

Thanks everyone!

2 Likes

If I’m reading them to myself:
(a → b) → a → b (A to B) to A to B
a → (a → b) → b A to (A to B) to B
where the words in parentheses are said more quickly together.

If I’m explaining them to someone else:
(a → b) → a → b a function that takes two arguments and returns a B. The first of argument is a function from A to B and the second argument is an A.
a → (a → b) → b a function that takes two arguments and returns a B. The first argument is an A and the second argument is a function from A to B.

2 Likes

(a -> b) -> a -> b A function that takes a function from a to b and an a and returns a b.
a -> (a -> b) -> b A function that takes an a and a function from a to b and returns a b.

2 Likes

There are multiple aspects in that type definition that make it a little harder than most.

(<|) : (a → b) → a → b

First, you need to mention that this is a function that is designed to be used infix. An infix function takes 2 arguments. The first argument is the left argument and in this case it is a function from a to b. The second argument is the right argument and in this case it is a value of type a. The result of the infix application of the arguments is of type b.

Explaining a type signature as above requires that the person already understands the concept of a function and of a higher order function ( a function that takes a function as an argument, or returns a function).

value : a - a value of type a

unary : a -> b - a function that takes a value of type a and evaluates to a value of type b

binary : a -> b -> c - a function that takes two arguments. First is a value of type a, second is a value of type b. The function evaluates to a value of type c

higherOrder : (a -> b) -> a -> b - a binary function that takes an unary function as the first argument and a value of type a as the second and evaluates to a value of type b.

And then you get into currying and partial application where a higher arity function can be reduced to a lower arity function by partial application.

So, binary: a -> b -> c it is actually an unary function that produces an unary function so… binary : a -> (b -> c) . ternary : a -> ( b -> ( c -> d)) , etc.

All this gets confusing fast if you don’t understand the idea of higher order functions.

2 Likes
<| = converter -> thing -> result
|> = thing -> converter -> result
3 Likes

This is a fun question!

I find when things get complicated, I try to use different sentence patterns for the same concepts to help distinguish between different levels of nesting. And I tend to repeat small chunks to myself and then build up larger chunks. So in your examples, I might think:

(<|) : (a → b) → a → b

  • okay, we’ve got a function
  • the first argument is another function that converts a to b
  • the second argument is an a
  • and it returns a b

(|>) : a → (a → b) → b

  • okay, we’ve got an a
  • and we’ve got a function that converts a's to b's
  • and it returns a b

(I guess I like to hype myself up by starting with “okay” :slight_smile: )

With those specific examples, I’m familiar enough with them that I wouldn’t normally think all that, but when I see functions that start to confuse me, that’s the type of self-talk I tend to fall back on.

5 Likes

@avh4 @pdamoc @plaxdan @Lucas_Payr @dta Thank you all! I think I was almost just relieved that I was not completely off in my own mind. Its one of those seemingly mundane things but I find myself questioning myself a lot when it comes to this particular practice, so just hearing how you all approach it really helps – especially knowing I’m not the only one doing the “okay okay” thing :slight_smile:

Thanks again all!

1 Like

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.