Skip to content

Instantly share code, notes, and snippets.

@JoeyEremondi
Last active February 7, 2018 14:16
Show Gist options
  • Save JoeyEremondi/26de88df1cadbc5347d9 to your computer and use it in GitHub Desktop.
Save JoeyEremondi/26de88df1cadbc5347d9 to your computer and use it in GitHub Desktop.
-- interface is a more familiar name for the intention of the construct
type alias Append a rest = { rest | append : a -> a -> a}
-- implement is a more familiar name
stringAppend rest = {rest | append = \x y -> x ++ y}
-- this is Monoid
type alias AppendWithId a rest = Append a {rest | id : a}
-- ^ 1 potential superclass
appendWithIdString rest = {rest | id = ""}
type alias Eq a rest =
{rest | eq : a -> a -> Bool}
neq : Eq a rest -> a -> a -> Bool
neq inst x y = not <| inst.eq x y
concat : AppendWithId a rest -> List a -> a
concat inst list =
case list of
(x::xs) ->
inst.append x (concat inst xs)
[] ->
inst.id
foo : Append a rest -> Eq a rest -> a -> a -> a
foo ainst einst x y =
if neq einst x y then
ainst.append x y
else
x
@rtfeldman
Copy link

I guess I feel differently, in that monads for monads sake is useful.

This is a complaint as old as Elm itself. I would recommend reading this post from Evan on this subject, and maybe some surrounding context in that thread.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment