Day 43

October 15, 2018
Haskell FP Guards HOFs

More Functional Patterns

Guards

A way of evaluating many truth statements separately. This is an alternative way of using case statements, although this method uses otherwise which is ideal for handling bottoms.

Bottoms - a non-value used to denote that the program cannot return a value or result.

avgGrade :: (Fractional a, Ord a) => a -> Char
avgGrade x
    | y>=0.9 ='A'
    | y>=0.8 ='B'
    | y>=0.7 ='C'
    | y >= 0.59 = 'D'
    | otherwise ='F'
        where y = x / 100

The pipe |syntax here signifies the beginning of a new guard case, similar to and else if you find in other languages. But different to if then, else, as each guard statement requires its own expression for its branch.

Function composition

This is a neat way of creating Higher Order Functions with the composition operator (.). instead of nesting functions with brackets, the (.) operator allows results of functions to be directly into other functions, evaluating left to right.

addList :: [Integer]
addList = take 5 . filter odd . enumFrom $ 1

The above reads as, enumerate all numbers from 1. Input that as the argument to filter for only odd numbers, then input that into take 5 which takes the first 5 elements in the list:

*Ex7> addList
[1,3,5,7,9]

Pointfree style

Pointfree is when you don’t have data in the higher order functions, but only nested functions. Data isn’t inputted until the function is executed.

Although I can’t seem to do this with data that is nested in the HOF chain.

For example when trying to convert the above to a pointfree style I can easily take out the fromEnum data by inferring it in the type signature:

addList :: Integer -> [Integer]
addList = take 5. filter odd . enumFrom  

But I cannot remove that 5 using the same method as I get a compile error:

addList :: Integer -> Integer -> [Integer]
addList = take . filter odd . enumFrom   

The GHC seems to be taking the first argument as the filter odd . enumFrom and not the inputted Integer from the type signature; as the error message says “Couldn’t match type ‘s[Integer]’ with ‘Int’”.

Any ideas how I could make the above into a pointfree style? (without having to add an argument to the addList declaration)

Day 107 - What do you call a typeclass from the 80's?

December 18, 2018
Haskell Functors

Day 102 - Katas but not yet Functors

December 14, 2018
Haskell Kata

Day 98 - ToDo List ft. Functor/Applicative

December 10, 2018
Haskell Testing
comments powered by Disqus