# 隐式编程

## 概述

J语言中，下列在一个数值的列表（阵列）上计算平均值的函数采用了一种无点样式代码：

avg=: +/ % #


+/通过将求和（+）插入（/）到一个阵列的所有元素之间来计算它们的合计值。#总计一个阵列的元素数目。%+/这个阵列的结果值除以#这个阵列的结果值。相同的隐式计算用APL2表达为：

avg ← +⌿ ÷ ≢


${\displaystyle \hom(A\times B,C)\cong \hom(B,C^{A})}$

## 例子

### APL家族

J语言中，欧拉公式${\displaystyle e^{ix}=\cos x+i\sin x}$ 可隐式表达为：

cos =: 2 o. ]
sin =: 1 o. ]
Euler =: ^@j. = cos j. sin


cos ← 2 ○ ⊢
sin ← 1 ○ ⊢
j   ← {⍺←0 ⋄ ⍺+0j1×⍵}  ⍝ 这部份不是隐式的
Euler ← *∘j = cos j sin


### Unix管道

sort | uniq -c | sort -rn


### 基于堆栈语言

 /fib
{
dup dup 1 eq exch 0 eq or not
{
dup 1 sub fib
exch 2 sub fib
} if
} def


### Python

def example(x):
y = foo(x)
z = bar(y)
w = baz(z)
return w


def compose(*fns):
return functools.partial(functools.reduce, lambda v, fn: fn(v), fns)

example = compose(baz, bar, foo)


### 函数式编程

sum (x:xs) = x + sum xs
sum [] = 0


sum xs = foldr (+) 0 xs


sum = foldr (+) 0


p x y z = f (g x y) z


p = \x -> \y -> \z -> f (g x y) z
= \x -> \y -> f (g x y)
= \x -> \y -> (f . (g x)) y
= \x -> f . (g x)
= \x -> ((.) f) (g x)
= \x -> (((.) f) . g) x
= ((.) f) . g


p = ((.) f) . g


mf criteria operator list = filter criteria (map operator list)


mf = (. map) . (.) . filter


## 引用

1. Manuel Alcino Pereira da Cunha (2005) Point-free Program Calculation
2. ^ W. Neville Holmes, ed. (2006) Computers and People
3. ^ Name code not values. Concatenative.org. [13 September 2013]. （原始内容存档于2013-09-29）.
4. ^ pipermail