C++ 用作函數式語言時,是否有語法上的缺失?
C++在作為函數式語言的時候,是否具有函數式語言所普遍具有的語法特性呢?
例如,在Mathematica中的Map與Apply等函數,在C++中應該如何實現?
template&
auto Apply(T t, U u) -&> decltype(t(u))
{
return t(u);
}
map等函數見這個
vczh_toys/Main.cpp at master · vczh/vczh_toys · GitHub
最簡單的apply無非就是這個樣子:
template &
inline auto apply(Fp f, Args... args)
-&> decltype(std::forward&
{ return std::forward&
如果你還要apply class member function之類的東西再加幾個特化就行:
template &
inline auto apply(Fp f, A0 a0, Args... args)
-&> decltype((std::forward&
{ return (std::forward&
template &
inline auto apply(Fp f, A0 a0) -&> decltype(std::forward&
{ return std::forward&
template &
inline auto apply(Fp f, A0 a0, Args... args)
-&> decltype(((*std::forward&
{ return ((*std::forward&
template &
inline auto apply(Fp f, A0 a0) -&> decltype((*std::forward&
{ return (*std::forward&
凡是和有限狀態機等價的都沒有語法缺失的問題寧合軍:
這個答案明顯有誤。有限狀態機等價於正則表達式,是不能識別a^nb^n的。
應該改成「和圖靈機等價」。apply 前面已經有人說了。。。map 最簡單粗暴的方法你直接把map(fn, lst) 里
apply(fn, lst[0])
這麼遞歸一遍不就行了。。。無。首先用c艹實現一個函數式語言解釋器,例如,Mathematica。
嚴格意義上來說,Apply在C艹里是找不到對應的語法的。為了更清楚解釋這個問題,,我們把Mathematica表達式轉換成Lisp表達式,也就是把M-expression變成S-expressionAdd[1,2,3]{1,2,3}其實它們根本是一樣的,寫成S-expression就是:(Add 1 2 3)(List 1 2 3)然後Apply無非就是把一個表達式的head換成另一個而已。——————————————————————————————————更新:其實這種寫法基本上可以看做Lisp系語言專屬的實現。在Mathematica里具有Hold屬性的函數,其實相當於Lisp的宏,Apply這樣能直接讀取語法樹的能力完全來自於Lisp宏的能力,所以也只有Lisp系能這麼實現Apply。而像是Haskell的map就是
map :: (a -&> b) -&> [a] -&> [b]
只能應用於列表類型(以及幾個對其他container類型的重載),無法完成Mathematica的Apply這種讀取語法樹的行為。
所以也沒有什麼語法上的缺失了,應該說是Mathematica在這個地方語法表現力太強了。推薦閱讀:
※怎樣評價 LambdaConf 提出的「函數式編程技能表」?
※Haskell Book 這本書怎麼樣?
※如何解釋 Haskell 中的單子(Monad)?
※如何學習 Haskell ?
※什麼是GADT?它有什麼作用?
TAG:WolframMathematica | C | 函數式編程 | Haskell | Scheme |