This might do for businesses, but clearly not adequate if we want
Haskell/Cucumber (ever) to be suitable for use in government.

Here I’d like to suggest a more rigorous approach, which hopefully will be
considered for implementation instead of the original proposal.


                            MODULE Data.List

                              1st proposal

To promote prosperity, creativity, entrepreneurship, and innovation by
providing convenient functions operating on lists, and for other purposes.

                   IN THE STANDARD LIBRARY OF HASKELL

                           September 10, 2013

Mr. KAZAK of Russia, Saint-Petersburg (for himself and Mr. GEHR, Mr. HAMBÜCHEN, Mr. WIEGLEY, Mr. ZIMMERMAN, Mr. CHEPLYAKA, Mr. ROSS, Mr. SNOYMAN, Mr. NEGRI,
Mr. YANG and Mr. FUJIMURA) introduced the following module; which was
referred to the Café of Haskell.


                                A MODULE

Be it approved by the General Public and Maintainers of `base` package,


SECTION ONE. SHORT TITLE; TABLE OF CONTENTS
===========================================

(a) Short Title - This Module may be cited as the ‘Data.List module’.

(b) Table of Contents - The table of contents of this Module is as follows:

Sec. 1. Short title; table of contents.

...


TITLE I - HISTORY AND BACKGROUND
--------------------------------

Sec. 101. Definitions.

Sec. 102. Action by Simon Peyton-Jones to protect Haskell users and
prevent success at all costs¹.

Sec. 103. Immunity for taking voluntary action against LANGUAGE pragmas
dedicated to theft of syntax.

Sec. 104. Immunity for taking voluntary action against libraries that
make heavy use of unsafePerformIO.

Sec. 105. Guidelines and study.

Sec. 106. Denying `base` maintainership to notorious Applicative => Monad
proposal supporters.


TITLE II — THE ‘FOLDL’ FUNCTION
-------------------------------

Sec. 201. Type of ‘foldl’.

Sec. 202. Specification of ‘foldl’.

Sec. 203. Implementation of ‘foldl’.


END OF TABLE OF CONTENTS
------------------------


                     TITLE I — HISTORY AND DEFINITIONS

                          SEC. 101. DEFINITIONS.

In this title:

(1) FUNCTION - The term ‘function’ has the meaning implied in the
Haskell 98 Report, even though it isn’t actually given there.

(2) LIST - The term ‘list’ means a datatype used to provide the means
of accessing data stored in it sequentially, starting with the first
element and moving to the next element without delay, i.e. in O(1) time.

(3) EMPTY LIST — The term ‘empty list’ denotes a list which does not
contain any data, explicitly or implicitly, and which restricts any of
the attempts to obtain its first element through the well-defined
mechanism of exceptions and compile-time pattern match failures.

(3) NON-EMPTY LIST - The term ‘non-empty list’ means a list which is
not an empty list.
                                     ...


                     TITLE II — THE ‘FOLDL’ FUNCTION

                        SEC. 201. TYPE OF ‘FOLDL’

For any types A and B, be they sum types, product types, a valid combination
of sum and/or product types; types defined in the Standard Library, defined
by users of Haskell or defined in one of the Imported Modules; resulting
from execution of Template Haskell; from execution of a generator written in another programming language, not excluding Haskell; or written by human(s):

(a) function ‘foldl’ requires an argument which itself must be a function:

    (1) which requires an argument of type A and shall produce a function:

    (2) which requires an argument of type B and shall produce
        a value of type A.

  (b) and shall produce a function:

    (1) which requires an argument of type A and shall produce a function:

    (2) which requires an argument of type, which denotes the set of all
        lists, empty or non-empty, together with bottom and further
        abominations, which shall contain elements of type B, and shall
        produce a value of type A.


                     SEC. 202. SPECIFICATION OF ‘FOLDL’

Assuming the following:

  (a) the argument of ′foldl’ is denoted by ‘f’.

  (b) the argument of the produced function is denoted by ′acc’.

  (c) the argument of the function, produced by the produced function,
      is denoted by ‘l’.

Then it shall be held that:

  (a) ‘foldl’ must be using ‘f’ while processing the elements of ‘l’, and
      it may not use any other function, either supplied to it implicitly
      or explicitly, defined in Data.List module, other modules included
      into Standard Library, Hackage or any other collection of modules.

    (1) Other functions may be defined for internal use by ‘foldl’, but
they shall not be used to replace ‘f’, as it is deemed highly unlikely
        that any of such defined functions are adequate replacements of ‘f’
        and do not attempt to invade any country through means of launching
        missiles.

  (b) ‘foldl’ must process ‘l’ as follows:

    (1) it shall not skip an element.

    (2) it shall process the elements in the sequential order enforced by
        structure of list datatype.

    (3) it shall process the first element.

    (4) it shall process the last element or never produce anything.

    (5) it shall not use any element twice or any higher number of times.

  (c) ‘foldl’ must not produce a function which would be capable of
      resorting to any of the abominations when processing ‘l’.

(1) specifically, when an argument of type A is demanded, it is permitted
        to use ‘acc’. Any usage of ‘bottom’ is prohibited.


                    SEC 203. IMPLEMENTATION OF ‘FOLDL’

The behaviour of function produced by ‘foldl’ when given a valid argument
‘f’ is described in this section.

  (a) Base case: ‘foldl’ shall produce a function which shall produce a
      function which, when it has been determined through pattern-matching
      or ‘null’ function, provided in Standard Library, that the list ‘l’
      is empty, shall use provided to it ‘acc’ as its returned value,
      without any attempt of modifying it.

  (b) Recursive case: ‘foldl' shall produce a function which shall produce
a function which, when it has been determined through pattern-matching
      or ‘null’ function, possibly using ‘not’ function, both provided in
      Standard Library, that the list ‘l’ is non-empty, shall:

    (1) represent it as a pair consisting of the first element of ‘l’ and
        the list containing all elements of ‘l’, necessarily excluding the
        first element, in order of their appearance in ′l’; for clarity,
        the first element of that pair may be denoted by ‘x’, and the other
        element — as ‘xs’.

    (2) apply the function, produced by ‘foldl’, to the result of applying
        the result of applying ‘f’ to ‘acc’ to ‘x’, and apply the produced
        function to ‘xs’.

    (3) return the produced value.


¹just kidding, sorry.

On Tue, 10 Sep 2013 16:41:38 +0400, Timon Gehr <timon.g...@gmx.ch> wrote:

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.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to