戻モドる sourceのVARIANT変数をtargetのVARIANTへmoveする
Function moveVariant(ByRef source As Variant) As Variant
 
    Function p_moveVariant(
 
a = moveVariant(b)
↑ swapVariant(a, b) : swapVariant(b, Empty) と同等ドウトウ
プレースホルダ(置かれた位置によって第1引数もしくは第2引数を受け取る)
Function ph_0() As Variant
プレースホルダ(第1引数を受け取る)
Function ph_1() As Variant
 
printM  zipWith(p_minus, Array(1, 2, 3), Array(9, 8, 7))
  -8  -6  -4
printM  zipWith(p_minus(ph_2, ph_1), Array(1, 2, 3), Array(9, 8, 7))
  8  6  4
↑引ヒキスウ数へのイ代入ダイニュウを操作ソウサ
プレースホルダ(第2引数を受け取る)
Function ph_2() As Variant
 
printM  zipWith(p_minus, Array(1, 2, 3), Array(9, 8, 7))
戻モドる   -8  -6  -4
printM  zipWith(p_minus(ph_2, ph_1), Array(1, 2, 3), Array(9, 8, 7))
  8  6  4
↑引ヒキスウ数へのイ代入ダイニュウを操作ソウサ
関数評価時に ph_0 を生成する
Function yield_0() As Variant
 
fun = p_foldl1(p_plus(yield_0, yield_0))
↑評価ヒョウカ時ジに p_foldl1(p_plus(ph_0, ph_0)) を生成セイセイ
関数評価時に ph_1 を生成する
Function yield_1() As Variant
 
fun = p_foldl1(p_plus(yield_1, yield_2))
↑評価ヒョウカ時ジに p_foldl1(p_plus(ph_1, ph_2)) を生成セイセイ
関数評価時に ph_2 を生成する
Function yield_2() As Variant
 
fun = p_foldl1(p_plus(yield_1, yield_2))
↑評価ヒョウカ時ジに p_foldl1(p_plus(ph_1, ph_2)) を生成セイセイ
戻モドる
Array() が IsMissing = True になることのWorkAround
Function Is_Missing_(Optional ByRef x As Variant) As Boolean
ユーザ関数をbindして関数オブジェクト化する(関数の部分適用)
    make_funPointer(func)                              引数の束縛なし
    make_funPointer(func, firstParam)                  1番目の引数を束縛
    make_funPointer(func, , secondParam)               2番目の引数を束縛
    make_funPointer(func, firstParam, secondParam)     両方の引数を束縛(遅延評価)
Function make_funPointer(ByVal func As LongPtr, _
                                      Optional ByRef firstParam As Variant, _
                                      Optional ByRef secondParam As Variant) As Variant
 
p_plus = make_funPointer(AddressOf plus, firstParam, secondParam)
↑plus 関数カンスウの関数カンスウオブジェクトを作成サクセイ
ユーザ関数をbindファンクタ化する(2番目の引数にデフォルト値を設定する場合)
Function make_funPointer_with_2nd_Default(ByVal func As LongPtr, _
                                                                Optional ByRef firstParam As Variant, _
 
p_log = make_funPointer_with_2nd_Default(AddressOf logN, firstParam, secondParam)
↑logN 関数カンスウの関数カンスウオブジェクトを作成サクセイ
(第ダイ2引数ヒキスウがOptionalで、省略ショウリャクされた場合バアイとされない場合バアイで挙動キョドウが異コトなる)
戻モドる ユーザ関数をbindファンクタ化する(3つのパラメータを持つ関数)
Function make_funPointer_with_3_parameters(ByVal func1 As LongPtr, _
                                        ByVal func2 As LongPtr, _
                                    ByVal func3 As LongPtr, _
                            ByRef firstParam As Variant, _
                            ByRef secondParam As Variant, _
                            ByRef thirdParam As Variant) As Variant
bindされた関数であることの判定
Function is_bindFun(ByRef val As Variant) As Boolean
未ミ束縛ソクバクの第ダイ1引数を束縛する
Function bind1st(ByRef func As Variant, ByRef firstParam As Variant) As Variant
 
    Function p_bind1st(
 
既に束ソクバク縛ズ済みの引数ヒキスウは変更ヘンコウできない(swap1stを使用シヨウする)
未ミ束縛ソクバクの第ダイ2引数を束縛する
Function bind2nd(ByRef func As Variant, ByRef secondParam As Variant) As Variant
 
    Function p_bind2nd(
 
既に束ソクバク縛ズ済みの引数ヒキスウは変更ヘンコウできない(swap2ndを使用する)
戻モドる 第1引数のswap
Sub swap1st(ByRef func As Variant, ByRef firstParam As Variant)
 
swap1st  fun, a         ' 一時的イチジテキにfunの束縛ソクバクされた第ダイ1引数ヒキスウをaと交換コウカンする
mapF(fun, m)             ' fun を使ツカう
swap1st  fun, a         ' 元モトに戻モドす
第2引数のswap
Sub swap2nd(ByRef func As Variant, ByRef secondParam As Variant)
 
swap2nd  fun, a         ' 一時的イチジテキにfunの束縛ソクバクされた第ダイ2引数ヒキスウをaと交換コウカンする
mapF(fun, m)             ' fun を使ツカう
swap2nd  fun, a         ' 元モトに戻モドす
配列(3次元ジゲンまで)の各要素に関数を適用する
Function mapF(ByRef func As Variant, ByRef matrix As Variant) As Variant
 
    Function p_mapF(
 
返りチ値はmatrixと同オナじ形カタチの配列ハイレツ
printM  mapF(p_plus, iota(1,10))
  2  4  6  8  10  12  14  16  18  20
戻モドる m = makeM(3, 3, iota(1, 9)) : printM  m
  1  2  3
  4  5  6
  7  8  9
printM  mapF(p_minus(,3), m)
  -2  -1  0
    1   2  3
    4   5  6
mapF(fun(a), m) または mapF(fun(, a), m)の構文糖
ただしaはmoveされ、処理後戻される。
式シキ fun(a) や fun(, a) に伴トモナう配列のコピーが避けられる。(大きな配ハイレツ列の場バアイ合考コウリョ慮をヨウ要する)
Function mapF_swap(ByRef fun As Variant, _
                            Optional ByRef x As Variant, _
                            Optional ByRef y As Variant, _
                            Optional ByRef z As Variant) As Variant
 
パターン1  mapF_swap(fun, a, m)      -> mapF(fun(a), m)
パターン2  mapF_swap(fun, , b, m)    -> mapF(fun(, b), m)
パターン3  mapF_swap(fun, a, , m)    -> mapF(fun(a), m)    (パターン1と同じ)
戻モドる パターン4  mapF_swap(fun, a, b, m)   -> mapF(fun(a, b), m) (禁止)
関数適用関数  1引数に対して関数を適用する   関数はBind式
Function applyFun(ByRef param As Variant, ByRef func As Variant) As Variant
 
    Function p_applyFun(
 
パターン1. applyFun(x  ,  Null)       ->  x
パターン2. applyFun(x  ,  Empty)    ->  x
パターン3. applyFun(x  , f(a, b))     ->  f(a, b)
パターン4. applyFun(x  , f(a) )       ->  f(a, x)
パターン5. applyFun(x  , f(, b) )      ->  f(x, b)
パターン6. applyFun(x  , f      )     ->  f(x, x)
関数に1引数を代入する関数
Function setParam(ByRef func As Variant, ByRef param As Variant) As Variant
戻モドる  
    Function p_setParam(
 
パターン1. setParam(Null    , x  )       ->  x
パターン2. setParam(Empty  , x )    ->  x
パターン3. setParam(f(a, b) , x  )     ->  f(a, b)
パターン4. setParam(f(a)    , x  )       ->  f(a, x)
パターン5. setParam(f(, b)  , x  )      ->  f(x, b)
パターン6. setParam(f       , x  )     ->  f(x, x)
関数合成(foldl)
Function foldl_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant
 
    Function p_foldl_Funs(
 
funcN(…func2(func1(func0(init)))…)
戻モドる 関数合成(scanl)
Function scanl_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant
 
    Function p_scanl_Funs(
 
foldl_Funsの履歴リレキ
関数合成(foldr)
Function foldr_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant
 
    Function p_foldr_Funs(
 
func0(func1(…(funcN(init)))…)
関数合成(scanr)
Function scanr_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant
 
    Function p_scanr_Funs(
 
foldr_Funsの履歴リレキ
戻モドる ((x, y), f)  に対して  f(x, y)     を返す
((x, y), (f1, f2, ...))  に対して  Array(f1(x, y), f2(x, y), ...)     を返す
Function applyFun2by2(ByRef params As Variant, ByRef funcs As Variant) As Variant
 
    Function p_applyFun2by2(
(f, (x, y))  に対して  f(x, y)     を返す
((f1, f2, ...), (x, y))  に対して  Array(f1(x, y), f2(x, y), ...)     を返す
Function setParam2by2(ByRef funcs As Variant, ByRef params As Variant) As Variant
 
    Function p_setParam2by2(
配列 matrix の各要素で述語による評価結果がゼロでないものの数
Function count_if(ByRef pred As Variant, ByRef matrix As Variant) As Variant
 
    Function p_count_if(
戻モドる 1次元配列から条件に合致するものを検索(最初にヒットしたインデックスを返す)
Function find_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant
 
    Function p_find_pred(
 
1次元配列以外であれば返り値はEmpty、無かった場合は UBound(vec) + 1 を返す
?find_pred(p_equal(5), iota(1,10))
4
?find_pred(p_less(11), iota(1,10))
10
1次元配列から条件に最良合致するものを検索(最初にヒットしたインデックスを返す)
Function find_best_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant
 
    Function p_find_best_pred(
 
a = uniform_int_dist(10, 1, 100)
戻モドる printM a
  40  92  12  49  81  8  5  90  59  12
printM find_best_pred(p_less, a)
6
 
述語による条件が満たされる間繰り返し関数適用
Function repeat_while(ByRef val As Variant, _
                              ByRef pred As Variant, _
                              ByRef fun As Variant, _
                              Optional ByVal n As Long = -1) As Variant
 
?repeat_while(1, p_less(, 100), p_mult(2))         ← < 100 が成ナり立タっている間アイダ *2 を繰り返す
128
?repeat_while(1, p_true, p_mult(2), 16)            ← *2を16回繰クり返カエす
65536
述語による条件が満たされない間繰り返し関数適用
Function repeat_while_not(ByRef val As Variant, _
                                  ByRef pred As Variant, _
                                  ByRef fun As Variant, _
                                  Optional ByVal n As Long = -1) As Variant
戻モドる
述語による条件が満たされる間繰り返し関数適用の履歴を生成
Function generate_while(ByVal val As Variant, _
                                ByRef pred As Variant, _
                                ByRef fun As Variant, _
                                Optional ByVal n As Long = -1) As Variant
述語による条件が満たされない間繰り返し関数適用の履歴を生成
Function generate_while_not(ByVal val As Variant, _
                                    ByRef pred As Variant, _
                                    ByRef fun As Variant, _
                                    Optional ByVal n As Long = -1) As Variant
1次元配列限定の foldl  (関数オブジェクトのみ)
Public Function p_foldl(
1次元配列限定の foldr  (関数オブジェクトのみ)
戻モドる Public Function p_foldr(
1次元配列限定の foldl1  (関数オブジェクトのみ)
Public Function p_foldl1(
1次元配列限定の foldr1  (関数オブジェクトのみ)
Public Function p_foldr1(
1次元配列限定の scanl  (関数オブジェクトのみ)
Public Function p_scanl(
戻モドる 1次元配列限定の scanr  (関数オブジェクトのみ)
Public Function p_scanr(
1次元配列限定の scanl1  (関数オブジェクトのみ)
Public Function p_scanl1(
1次元配列限定の scanr1  (関数オブジェクトのみ)
Public Function p_scanr1(
zipWithをfoldlする
Function foldl_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As Variant) As Variant
zipWithをfoldrする
Function foldr_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As Variant) As Variant
戻モドる
zipWithをfoldl1する
Function foldl1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant
zipWithをfoldr1する
Function foldr1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant
zipWithをscanlする
Function scanl_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As Variant) As Variant
zipWithをscanrする
Function scanr_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As Variant) As Variant
zipWithをscanl1する
戻モドる Function scanl1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant
zipWithをscanr1する
Function scanr1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant