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&(f)(std::forward&(args)...))
{ return std::forward&(f)(std::forward&(args)...); }

如果你還要apply class member function之類的東西再加幾個特化就行:

template &
inline auto apply(Fp f, A0 a0, Args... args)
-&> decltype((std::forward&(a0).*f)(std::forward&(args)...))
{ return (std::forward&(a0).*f)(std::forward&(args)...); }

template &
inline auto apply(Fp f, A0 a0) -&> decltype(std::forward&(a0).*f)
{ return std::forward&(a0).*f; }

template &
inline auto apply(Fp f, A0 a0, Args... args)
-&> decltype(((*std::forward&(a0)).*f)(std::forward&(args)...))
{ return ((*std::forward&(a0)).*f)(std::forward&(args)...); }

template &
inline auto apply(Fp f, A0 a0) -&> decltype((*std::forward&(a0)).*f)
{ return (*std::forward&(a0)).*f; }


凡是和有限狀態機等價的

都沒有語法缺失的問題

寧合軍:

這個答案明顯有誤。有限狀態機等價於正則表達式,是不能識別a^nb^n的。

應該改成「和圖靈機等價」。


apply 前面已經有人說了。。。

map 最簡單粗暴的方法你直接把

map(fn, lst) 里

apply(fn, lst[0])

這麼遞歸一遍不就行了。。。


無。

首先用c艹實現一個函數式語言解釋器,例如,Mathematica。


嚴格意義上來說,Apply在C艹里是找不到對應的語法的。為了更清楚解釋這個問題,,我們把Mathematica表達式轉換成Lisp表達式,也就是把M-expression變成S-expression

Add[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 |