X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fmaster-project%2Freport.git;a=blobdiff_plain;f=Chapters%2FFuture.tex;h=38d618ff89906090885a9f359ee97e36dfbfc193;hp=852d14fe179308df40ffed123e3b5979d674ced9;hb=19c17205efa182b80916caa31afeadad9d2dd5b5;hpb=627861d0a5c3dfeb94b75f0f09c3e45906e46ea0 diff --git a/Chapters/Future.tex b/Chapters/Future.tex index 852d14f..38d618f 100644 --- a/Chapters/Future.tex +++ b/Chapters/Future.tex @@ -47,13 +47,40 @@ will be desugared into: (somefunc a) >> (otherfunc b) \stophaskell -\todo{Properly introduce >>=} -There is also the \hs{>>=} operator, which allows for passing variables from -one expression to the next. If we could use this notation to compose a -stateful computation from a number of other stateful functions, this could -move all the boilerplate code into the \hs{>>} operator. Perhaps the compiler -should be taught to always inline the \hs{>>} operator, but after that there -should be no further changes required to the compiler. +The main reason to have the monadic notation, is to be able to wrap +results of functions in a datatype (the \emph{monad}) that can contain +extra information, and hide extra behaviour in the binding operators. + +The \hs{>>=} operator allows extracting the actual result of a function +and passing it to another function. Let's try to illustrate this from an +example. The following snippet: + +\starthaskell +do + x <- somefunc a + otherfunc x +\stophaskell + +will be desugared into: + +\starthaskell +(somefunc a) >>= (\\x -> otherfunc x) +\stophaskell + +The \hs{\\x -> ...} notation creates a lambda abstraction in Haskell, +that binds the \hs{x} variable. Here, the \hs{>>=} operator is supposed +to extract whatever result somefunc has and pass it to the lambda +expression created. This will probably not make the monadic notation +completely clear to a reader without prior experience with Haskell, but +it should serve to understand the following discussion. + +The monadic notation could perhaps be used to compose a number of +stateful functions into another stateful computation. Perhaps this could +move all the boilerplate code into the \hs{>>} and \hs{>>=} operators. +Because the boilerplate is still there (it's not magically disappeared, +just moved into these functions), the compiler should still be able to compile +these descriptions without any special magic (though perhaps it should +always inline the binding operators to reveal the flow of values). This is highlights an important aspect of using a functional language for our descriptions: We can use the language itself to provide abstractions of common @@ -126,7 +153,7 @@ Note that the \hs{FooState} type has changed (so indirectly the type of stateful functions at a time, the final state consists of nested two-tuples. The final \hs{()} in the state originates from the fact that the \hs{return} function has no real state, but is part of the composition. We could have left -out the return statement (and the \hs{outb <-} part) to make \hs{foo}'s return +out the return expression (and the \hs{outb <-} part) to make \hs{foo}'s return value equal to \hs{funcb}'s, but this approach makes it clearer what is happening. @@ -356,7 +383,7 @@ Note that in the above example the \hs{suba} and \hs{subb} functions are is calculated as well, but only saved when the right clock has an up transition. -As you can see, there is some code duplication in the case statement that +As you can see, there is some code duplication in the case expression that selects the right clock. One of the advantages of an explicit approach like this, is that some of this duplication can be extracted away into helper functions. For example, we could imagine a \hs{select_clock} function, which @@ -391,8 +418,8 @@ behaviour is not needed. The main cost of this approach will probably be extra complexity in the compiler: The paths (state) data can take become very non-trivial, and it -is probably hard to properly analyze these paths and produce the intended VHDL -description. +is probably hard to properly analyze these paths and produce the +intended \VHDL description. \section{Multiple cycle descriptions} In the current Cλash prototype, every description is a single-cycle @@ -573,7 +600,7 @@ lightly. This is of course a very intrusive solution. Every type must become member of this typeclass, and there is now some member in every type that is a special don't care value. Guaranteeing the obvious don't care semantics - also becomes harder, since every pattern match or case statement must now + also becomes harder, since every pattern match or case expressions must now also take care of the don't care value (this might actually be an advantage, since it forces designers to specify how to handle don't care for different operations).