[Haskell-cafe] Proposal: New syntax for Haskell

Timon Gehr timon.gehr at gmx.ch
Tue Sep 10 14:41:38 CEST 2013


On 09/10/2013 09:30 AM, Niklas Hambüchen wrote:
> Impressed by the productivity of my Ruby-writing friends, I have
> recently come across Cucumber: http://cukes.info
>
>
> It is a great tool for specifying tests and programs in natural
> language, and especially easy to learn for beginners.
>
> I propose that we add a Cucumber syntax for Haskell, with the extension
> ".chs", next to .hs and .lhs.
>
>
> Code written in cucumber syntax is concise and easy to read: You can
> find some example code in https://gist.github.com/nh2/6505995. Quoting
> from that:
>
>    Feature: The Data.List module
>
>      In order to be able to use lists
>      As a programmer
>      I want a module that defines list functions
>
>      Scenario: Defining the function foldl
>        Given I want do define foldl
>        Which has the type (in brackets) a to b to a (end of brackets),
>                           to a, to list of b, to a
>        And my arguments are called f, acc, and l
>        When l is empty
>        Then the result better be acc
>        Otherwise l is x cons xs
>        Then the result should be foldl f (in brackets) f acc x
>                                  (end of brackets) xs
>
>
> PS: People even already started a testing framework for Haskell in it:
> https://github.com/sol/cucumber-haskell#cucumber-for-haskell
>

The above hardly is an acceptable state of affairs. While I appreciate 
the effort, clearly Cucumber is a rather limited tool and should be 
replaced by something more sophisticated that actually delivers the 
promises of conciseness and being easy to read.

My first shot (this can probably be made even more concise and/or easier 
to read):

Feature: The Data.List module

In order to be able to use lists more conveniently
As a programmer
I want a module that defines some common operations on lists

Scenario: Defining the function 'foldl'
   Given I want to define 'foldl'
   Which whenever given a thing that whenever given a thing of some 
first kind will give a thing that whenever given a thing of some second 
kind will give a thing of the first kind again, will give something that 
whenever given a thing of the first kind will give something that 
whenever given a list containing things of the second kind will give 
something of the first kind.
   When the list is empty
   Then the result better be the aforementioned thing of the first kind
   Otherwise the list has a first thing in it and the remaining things 
form a list again. Then we get the result by giving to 'foldl' the first 
thing mentioned and to the result we give the result we get by giving 
the first thing in the list to the thing we get by giving the thing of 
the first kind to the thing we already gave to 'foldl' and then give to 
what we get the list of remaining things.







More information about the Haskell-Cafe mailing list