Annotation of 43BSDReno/share/doc/ps2/07.fp/manCh1.rno, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1980 Regents of the University of California.
        !             2: .\" All rights reserved.  The Berkeley software License Agreement
        !             3: .\" specifies the terms and conditions for redistribution.
        !             4: .\"
        !             5: .\"    @(#)manCh1.rno  6.1 (Berkeley) 4/29/86
        !             6: .\"
        !             7: .sp
        !             8: .NS 1 "Background"
        !             9: .sp
        !            10: .pp
        !            11: \fBFP\fP stands for a \fIFunctional Programming\fP language.
        !            12: Functional programs
        !            13: deal with \fIfunctions\fP instead of \fIvalues\fP.
        !            14: There is  no explicit  representation of state, there are
        !            15: no assignment statments, and hence,
        !            16: no variables.
        !            17: Owing to the lack of state, FP functions are free from
        !            18: side-effects;  so we
        !            19: say the FP is \fIapplicative\fP.
        !            20: .pp
        !            21: All functions take one argument and they are evaluated using
        !            22: the single FP
        !            23: operation, \fIapplication\fP (the colon ':' is the apply operator).
        !            24: For example, we read $~+^:^<3~4>~$ as \*(lqapply
        !            25: the function '+' to its argument <3 4>\*(rq.
        !            26: .pp
        !            27: Functional programs express a functional-level combination of
        !            28: their components
        !            29: instead of describing state changes using value-oriented
        !            30: expressions.
        !            31: For example, we write the function returning the
        !            32: \fIsin\fP of the \fIcos\fP
        !            33: of its input, \*(IE $sin(cos(x))$, as:
        !            34: $sin^@^cos$.  This is a \fIfunctional expression\fP, consisting
        !            35: of the single \fIcombining form\fP called \fIcompose\fP ('@'
        !            36: is the compose operator)
        !            37: and its \fIfunctional arguments\fP \fIsin\fP and \fIcos\fP.
        !            38: .pp
        !            39: All combining forms take functions as arguments and return
        !            40: functions as results; functions may either be applied,
        !            41: \*(EG
        !            42: $sin @ cos^:^3$, or used as a functional argument in another functional
        !            43: expression, \*(EG \fItan @ sin @ cos\fP.
        !            44: .pp
        !            45: As we have seen,
        !            46: FP's combining forms allow us to express
        !            47: control abstractions without the use of variables.
        !            48: The \fIapply to all\fP functional form (&)
        !            49: is another case in point.  The function '& exp'
        !            50: exponentiates all the elements of its argument:
        !            51: .sp 4p
        !            52: .EQ I (1.1)
        !            53: "&exp : <1.0 2.0>" ~==~ "<2.718 7.389>"
        !            54: .EN
        !            55: .sp 4p
        !            56: In (1.1)
        !            57: there are
        !            58: no induction variables, nor a
        !            59: loop bounds specification.
        !            60: Moreover, the code is useful for any size argument,
        !            61: so long as the sub-elements of its argument conform to the domain of the
        !            62: \fIexp\fP function.
        !            63: .pp
        !            64: We must change our view of the programming process
        !            65: to adapt to the functional
        !            66: style.
        !            67: Instead of writing down a set of steps that manipulate and assign values,
        !            68: we compose functional expressions
        !            69: using
        !            70: the higher-level functional forms.
        !            71: For example, the function  that adds a
        !            72: scalar to all elements of a vector will be written in two steps.  First,
        !            73: the function that distributes the scalar amongst each element
        !            74: of the vector:
        !            75: .sp 4p
        !            76: .EQ I (1.2)
        !            77: "distl : <3 <4 6>>" ~==~ "<<3 4> <3 6>>"
        !            78: .EN
        !            79: .sp 4p
        !            80: Next, the function that adds the pairs of elements that
        !            81: make up a sequence:
        !            82: .sp 4p
        !            83: .EQ I (1.3)
        !            84: "&+ : <<3 4> <3 6>>" ~==~ "<7 9>"
        !            85: .EN
        !            86: .sp 4p
        !            87: .pp
        !            88: In a value-oriented programming language the computation
        !            89: would be expressed as:
        !            90: .sp 4p
        !            91: .EQ I (1.4)
        !            92: "&+ : distl : <3 <4 6>>,"
        !            93: .EN
        !            94: .sp 4p
        !            95: which means to apply 'distl' to the input and then to apply '+'
        !            96: to every element of the result.
        !            97: In FP we write (1.4) as:
        !            98: .sp 4p
        !            99: .EQ I (1.5)
        !           100: "&+ @ distl : <3 <4 6>>."
        !           101: .EN
        !           102: .sp 4p
        !           103: The functional expression of (1.5) replaces
        !           104: the two step value expression of (1.4).
        !           105: .pp
        !           106: Often,
        !           107: functional expressions are built from the inside out,
        !           108: as in LISP.
        !           109: In the next example we derive a function that scales then
        !           110: shifts a vector, \*(IE for scalars $a,~b^$ and a vector $v vec$,
        !           111: compute $a~+~b v vec$.  This FP function will have three
        !           112: arguments, namely $a,~b~$ and $~v vec$.  Of course, FP
        !           113: does not use formal parameter names, so
        !           114: they will be designated by the function symbols 1, 2, 3.
        !           115: The first code segment scales $v vec~$ by $b$ (defintions
        !           116: are delimited with curly braces '{}'):
        !           117: .sp 4p
        !           118: .EQ I (1.6)
        !           119: "{scaleVec &\(** @ distl @ [2,3]}"
        !           120: .EN
        !           121: .sp 4p
        !           122: The code segment in (1.5)
        !           123: shifts the vector.
        !           124: The completed function is:
        !           125: .sp 4p
        !           126: .EQ I (1.7)
        !           127: "{changeVec &+ @ distl @ [1 , scaleVec]}"
        !           128: .EN
        !           129: .pp
        !           130: In the derivation of the program we wrote from right to left,
        !           131: first doing the \fIdistl\fP's and then composing with the
        !           132: \fIapply-to-all\fP functional form.
        !           133: Using an imperative language, such as Pascal,
        !           134: we  would write the program from
        !           135: the outside in, writing the loop
        !           136: before inserting the arithmetic operators.
        !           137: .pp
        !           138: Although
        !           139: FP encourages a recursive programming style,
        !           140: it provides combining forms to avoid explicit recursion.
        !           141: For example, the
        !           142: right insert  combining form (!)
        !           143: can be used to write a function
        !           144: that adds up a list of numbers:
        !           145: .sp 4p
        !           146: .EQ I (1.8)
        !           147: "!+ : <1 2 3>" ~==~ 6
        !           148: .EN
        !           149: .pp
        !           150: The equivalent, recursive function is much longer:
        !           151: .sp 4p
        !           152: .EQ I (1.9)
        !           153: "{addNumbers (null -> %0 ; + @ [1, addNumbers @ tl])}"
        !           154: .EN
        !           155: .pp
        !           156: The generality of the combining forms encourages hierarchical
        !           157: program development.  Unlike APL,
        !           158: which restricts
        !           159: the use of combining forms to certain builtin functions,
        !           160: FP allows combining forms to take any functional expression as
        !           161: an argument.
        !           162: .bp

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.