Skip to content

Instantly share code, notes, and snippets.

@kapranov-anton
Created September 6, 2019 23:03

Revisions

  1. kapranov-anton created this gist Sep 6, 2019.
    50 changes: 50 additions & 0 deletions Example.elm
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    import Html exposing (text)

    type NodeF v a
    = Empty v
    | Elem (List a)

    nodeMap : (a -> b) -> NodeF v a -> NodeF v b
    nodeMap f node =
    case node of
    Empty v -> Empty v
    Elem items -> Elem (List.map f items)

    type FixNode v = FixNode (NodeF v (FixNode v))

    nodeCata : (NodeF v a -> a) -> FixNode v -> a
    nodeCata alg (FixNode node) =
    alg (nodeMap (nodeCata alg) node)


    main = text <| Debug.toString <| {
    sum = nodeCata sumNode ff,
    mul = nodeCata mulNode ff,
    list = nodeCata aggNode ff}

    ff = FixNode (Elem [
    FixNode (Empty 3),
    FixNode (Empty 2),
    FixNode (Elem [
    FixNode (Empty 5),
    FixNode (Empty 6),
    FixNode (Empty 1)
    ])
    ])
    sumNode : NodeF Int Int -> Int
    sumNode n =
    case n of
    Empty v -> v
    Elem items -> List.sum items

    mulNode : NodeF Int Int -> Int
    mulNode n =
    case n of
    Empty v -> v
    Elem items -> List.product items

    aggNode : NodeF v (List v) -> List v
    aggNode n =
    case n of
    Empty v -> [v]
    Elem items -> List.concat items