Giter Site home page Giter Site logo

dag's Introduction

Stories in Ready dag

Directed Acyclic Graphs for Haskell

Description

This is a type-safe directed acyclic graph library for Haskell. This library differs from others in a number of ways:

  • Edge construction is incremental, creating a "schema":

    {-# LANGUAGE DataKinds #-}
    
    import Data.Graph.DAG.Edge
    
    -- | Edges are statically defined:
    edges = ECons (Edge :: EdgeValue "foo" "bar") $
      ECons (Edge :: EdgeValue "bar" "baz") $
      ECons (Edge :: EdgeValue "foo" "baz")
      unique -- ENil, but casted for uniquely edged graphs
  • The nodes are separate from edges; graph may be not connected:

    data Cool = AllRight
              | Radical
              | SuperDuper
    
    graph = GCons "foo" AllRight $
      GCons "bar" Radical $
      GCons "baz" SuperDuper $
      GNil edges
  • Type safety throughout edge construction:

    *Data.Graph.DAG> :t edges
    edges
      :: EdgeSchema
           '['EdgeType "foo" "bar", 'EdgeType "bar" "baz",
             'EdgeType "foo" "baz"] -- Type list of edges
           '['("foo", '["bar", "baz"]), '("bar", '["baz"])] -- potential loops
           'True -- uniqueness
  • Various type-level computation

    *Data.Graph.DAG> :t getSpanningTrees $ edges
    getSpanningTrees $ edges
      :: Data.Proxy.Proxy
           '['Node "foo" '['Node "bar" '['Node "baz" '[]],
                           'Node "baz" '[]],
             'Node "bar" '['Node "baz" '[]],
             'Node "baz" '[]]
    
    *Data.Graph.DAG> reflect $ getSpanningTrees $ edges
    [Node "foo" [Node "bar" [Node "baz" []]
                ,Node "baz" []]
    ,Node "bar" [Node "baz" []]
    ,Node "baz" []]

This library is still very naive, but it will give us compile-time enforcement of acyclicity in these graphs - ideal for dependency graphs.

Usage

You will need -XDataKinds for the type-level symbols:

{-# LANGUAGE DataKinds #-}

import Data.Graph.DAG
import GHC.TypeLits

...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.