タイトル詐欺でごめんなさい。
これから解説する事象はPowerQueryなので、Haskellや本格言語には当てはまらないかもしれませんが、本質的、根本的には同じだと思います(抽象化)。
結論 = Excelは最強のノーコード、ローコードツールだった(ファンクション関数)
以下解説
let
ソース = Excel.CurrentWorkbook(){[Name="ソース"]}[Content],
//初手Table.Bufferしていますが、これはあくまで解説用
元 = Table.Buffer(Table.TransformColumnTypes(ソース,{{"文字列", type text}})),
リスト用テーブル = Excel.CurrentWorkbook(){[Name="リスト用テーブル"]}[Content],
リスト = List.Buffer(List.Distinct(リスト用テーブル[リスト用列])),
//ファンクション関数を宣言(今回の例では 列追加 という名前のファンクション関数です)
//引き渡す引数はList.Accumulate関数で引き渡された引数を使用
列追加 = (列を追加したテーブル, 現在値の項目) =>
let
//リスト用テーブルの条件リスト列をリストの現在の値(カレント)でフィルターし、リスト用テーブルの[条件リスト]列を戻り値にする(答え、演算結果)、代入する
条件リスト = Table.SelectRows(リスト用テーブル, each [条件リスト列] = 現在値)[条件リスト列],
//上で条件リスト変数(ステップ名)に代入した「条件リスト」を活用、利用し、下のTable.AddColumn関数から引き渡した列を追加したテーブルの[文字列]列に「条件リスト」の値、項目が含まれていないか調べる
//つまりOR OR OR...条件
フィルタ = (文字列) => List.Select(条件リスト, each Text.Contains(文字列,_)),
//上の関数で返された結果を(今回の例では)スペース区切りで結合(List.Select関数は条件に合致したリストをプレゼントしてくれます)
合致した項目を結合 = (x) => Text.Combine(x," "),
//やっと本題です、お伝えしたかったことは既存の関数でネスト出来る事は、ファンクション関数、カスタム関数でもネスト出来ますよ、という事です。
処理結果 = Table.AddColumn(列を追加したテーブル, 現在値の項目,each 結合(フィルタ([文字列])))
in
処理結果,
//列追加 はファンクション関数
列を列名リストにもとづいて動的に追加 = List.Accumulate(リスト,元,列追加)
in
列を列名リストにもとづいて動的に追加
どうでしょうか?
普通に書けば
List.Accumulate(List,TableName,(累計値,current) => Table.AddColumn(累計値,current,each Text.Combine(List.Select(Table.SelectRows(リスト用テーブル,(x) => [条件リスト] = current)[条件リスト],(y) => Text.Contains([文字列],y)," "))
という非常に長い関数のネストを一筆書きで書かなければなりません。
しかし、カスタム関数によって、
それぞれの処理が、
一行ずつ記述する事が出来、最終的に
結合(フィルタ([文字列]))
と書くことが出来ます
フィルタ関数で条件に合致した項目が返され,
その結果のリストが、
そのまま結合関数(リスト)の引数として引き渡される、
ということですね
これは二階建だそうです
オチ
これってワークシート関数のネストじゃないか!
以上