編程泛函(或生成函數的函數)我有一個問題,我想要的解決方案是使用一個函數產生另一個函數。 這是一個玩具範例。 我預計它會回來[3,4,5]。它沒有像我希望的那樣工作,因為顯然傳遞的參數(偏移量)不可用於返回的匿名函數。 我的猜測是有一種方法可以透過替換來做到這一點,但我無法弄清楚。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));進階統計建模實驗設計品質和工藝工程回覆:泛函程式設計(或產生函數的函數)抱歉在這裡重複發布,但實際上有更好的方法來做到這一點,只需要修改功能:
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Eval( Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
) )
);
funWrapper([1,2,3], funFUnctional(2));回覆:泛函程式設計(或產生函數的函數)@SDF1 ,我試圖找到函數為零的參數值,類似於單根R 中的函數 我不知道有類似的 JMP 功能。 無論如何,我偷了代碼來做到這一點,所以這很容易:)
回覆:泛函程式設計(或產生函數的函數)請注意,JMP14 類別的功能並不完整,如果您過度依賴它們,您可能會被燒毀;然而,在 JMP12+ 中,您可以使用命名空間和一些元程式設計來建立類別(包括繼承、建構函式、析構函式等)。
為了回答OP的最初問題——您只需對腳本進行最少的編輯就可以實現您的目標——只需注意,JSL函數的返回值在返回之前會被評估(使用Eval()語句)。因此,如果您的最後一條語句是未計算的表達式(例如 Expr( Function( _definition_ ) ),那麼它將按預期傳回該函數。在第二個函數中只需要一個小技巧就可以呼叫該函數(“fun = fun”語句)。
funWrapper = Function({array, fun},
fun = fun;
fun(array);
);
funFunctional = Function({offset},
Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
)
);
funWrapper([1,2,3], funFUnctional(2));回覆:泛函程式設計(或產生函數的函數)你好@米特曼,
聽起來您正在嘗試求解方程式的根(在本例中是函數,而不是 JSL Function()),對嗎?
有一個名為 Minimize() 的內建 JSL 函數,您可以將函數傳遞給該函數,並為 Minimize() 函數提供起點,以開始其最佳化例程。 這可能比為此編寫自己的 JSL Function() 更容易。 您可以閱讀有關它的部落格文章這裡。
希望有幫助!,
DS
回覆:泛函程式設計(或產生函數的函數)你好@SDF1 , 謝謝回覆。 然而,這不適用於我的實際用例。 我希望能夠將任意(單調)函數作為參數傳遞給找到零的函數。 如果我明確定義每個函數,這很簡單,但是當我想編寫一個函數來從參數化類別建立函數實例時,我遇到了麻煩。 我是在 R 中長大的,R 並不是真正的面向對象,但其範圍規則允許像我在原始帖子中使用的程式碼。
- 電磁波
回覆:泛函程式設計(或產生函數的函數)你好@米特曼,
不確定這是否正是您想要的,但它至少可以解決您在原始帖子中給出的示例。
Names Default to Here (1);
fWrap = Function({array, offset}, fFun(array offset));
fFun = Function({x, offset}, x + offset);
fWrap([3, 4, 5, 6], 5 );這將返回 [8, 9, 10, 11]。
這是一個有趣的問題。 如果您能分享為什麼需要這樣做,我很好奇。
希望這可以幫助!,
DS
回覆:泛函程式設計(或產生函數的函數)感謝克雷格分享這些富有洞察力的小插曲。
以下是使用這兩種方法的解決方案。 類別對我來說更直觀(並且“this”肯定比命名空間(expr(ns<
在 JMP 14 Pro 和 JMP 12 Pro 中進行了測試。 類別在 JMP 12 Pro 中不可用。
funOffsetAdder = Function({offset},
ns = NewNamespace();
ns:offset = offset;
ns:theMethod = EvalExpr(
Function({x},
this = namespace(expr(ns<<GETNAME></GETNAME>回覆:泛函程式設計(或產生函數的函數)我做了一些實驗:如何使用定義類和使用 JSL 物件進行函數式編程
如果您弄清楚了更多謎題,請回帖;目前,我不太使用 JSL 類,但它們可能是實現您想要的功能的最佳方法。 命名空間可能是等效的,沒有一些子類化的想法。 任何一個都可以讓您將函數和資料打包在一起,並透過引用將包傳遞給另一個函數。