这并不是您问题的正确答案,但我将函数式风格嵌入命令式语言的经验非常可怕。虽然代码几乎同样简洁,但它保留了命令式语言中推理的复杂性。
嵌入的复杂性通常需要对语言的细节和极端情况有最深入的了解。这大大增加了抽象的成本,因为必须始终仔细考虑这些事情。由于抽象成本如此之高,更容易将一个有副作用的函数放入惰性流生成器中,然后死于微妙的错误。
FC++ 的一个例子:
struct Insert : public CFunType<int,List<int>,List<int> > {
List<int> operator()( int x, const List<int>& l ) const {
if( null(l) || (x > head(l)) )
return cons( x, l );
else
return cons( head(l), curry2(Insert(),x,tail(l)) );
}
};
struct Isort : public CFunType<List<int>,List<int> > {
List<int> operator()( const List<int>& l ) const {
return foldr( Insert(), List<int>(), l );
}
};
我相信这是试图表达以下 Haskell 代码:
-- transliterated, and generalized
insert :: (Ord a) => a -> [a] -> [a]
insert x [] = [x]
insert x (a:as) | x > a = x:a:as
| otherwise = a:insert x as
isort :: (Ord a) => [a] -> [a]
isort = foldr insert []
我将让您随着程序的增长来判断该方法的复杂性。
我认为代码生成是一种更具吸引力的方法。您可以将自己限制在目标语言的一小部分,从而可以轻松移植到其他目标语言。诚实的函数式语言中的抽象成本几乎为零,因为毕竟它们是为此而设计的(就像在命令式语言中对命令式代码进行抽象相当便宜一样)。