モド 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