ãã为ä»ä¹è¦è®¾è®¡ä¸é¨æ°è¯è¨ï¼åå æ é就两个ï¼è¦ä¹æ§çè¯è¨å®å¨æ¯è®©äººåä¸äºï¼è¦ä¹æ¯é对é¢å设计çä¸ç¨è¯è¨ãåä¸ç§æå°±ä¸è®²äºï¼å 为å¦æ没æå
·ä½çé¢åç¥è¯çè¯ï¼è¿ç§ä¸è¥¿æ°¸è¿é½åä¸å¥½ï¼è¬å¦SQLæ°¸è¿ä¸å¯è½åºèªä¸ä¸ªæ°æ®åºå¾çç人æéï¼ï¼åºæ¬ä¸è¿ä¸æ¯ä»ä¹è¯è¨è®¾è®¡çé®é¢ãæ以è¿ä¸ªç³»ååªä¼é对åä¸ç§æ
åµââä¹å°±æ¯è®¾è®¡ä¸é¨éç¨çè¯è¨ãéç¨çè¯è¨å
¶å®ä¹æèªå·±çâé¢åâï¼åªæ¯å¤ªå¤äºï¼æ以被淡åäºã纵è§åå²ï¼ä½ 让ä¸ä¸ªåªåè¿å°éçé¢åç人å»è®¾è®¡ä¸é¨è¯è¨ï¼å¦æä»æ²¡æåè¿ç¨åºè®¾è®¡è¯è¨ç论çç³»ç»æè²ï¼é£åªè½ååºå±ãè¬å¦è¯´goå°±æ¯å
¶ä¸ä¸ä¸ªââè½ç¶ä»ç¹å¾çé¼ï¼ä½åæ£ä¸å
å«â设计è¯è¨âè¿ä¸ªäºæ
ã
ããå æ¤ï¼å¨21ä¸çºªä½ è¿è¦åä¸é¨è¯è¨ï¼æ éå°±æ¯å¯¹ææçéç¨è¯è¨é½ä¸æ»¡æï¼æä»¥ä½ æ³èªå·±åä¸ä¸ªãä¸æ»¡æä½ç°å¨ä»ä¹æ¹é¢ï¼è¬å¦è¯´C#çåå å¯è½å°±æ¯ä»ç¹ä¸å¤å¸
å¦ï¼è¬å¦è¯´C++çåå å¯è½å°±æ¯èªå·±æºå太ä½holdä¸ä½å¦ï¼è¬å¦è¯´Haskellçåå å¯è½å°±æ¯ç¨ç人太å°æä¸å°äººå¦ï¼è¬å¦è¯´Cçåå å¯è½å°±æ¯å®å¨æ¯æ æ³å®æ人åæ½è±¡æ以没ælinusçæ°´å¹³ç人é½ä¼æCè¯è¨åæå±ä½æ¯ä½ åæä¸å°linuså¦ï¼æ»ä¹æåç§åæ ·çåå ãä¸è¿æé¤ä½¿ç¨è
çæºåå ç´ æ¥è®²ï¼å
¶å®æå 个è¯è¨æè¿æ¯å¾æ¬£èµçââC++ãC#ãHaskellãRuståRubyãå¦æè¦æç»å
¨ä¸ççè¯è¨æåï¼åäºååæ£æ¯è¿äºä¸ªï¼è½ç¶ä»ä»¬ä¹é´å¯è½å¾é¾å³åºèè´ãä¸è¿å°±ç®å¦æ¤ï¼å
¶å®è¿äºè¯è¨ä¹æä¸äºè®©æä¸ç½çå°æ¹ï¼è®©æä¸ç´å¾æ³åä¸ä¸ªæ°çè¯è¨ï¼æ¥ç»èªå·±ç¨ï¼ï¼ï¼ï¼ï¼è¯æ®å°±æ¯âââçæçå客âã
ããé£ä¹ãä¸ä¸ªå¥½çè¯è¨ç好ï¼ä½ç°å¨ä»ä¹æ¹é¢å¢ï¼ä¸ç´ä»¥æ¥ï¼äººä»¬é½è§å¾ï¼åªæåºå¥½ç¨ï¼è¯è¨æä¼å¥½ç¨ãå
¶å®è¿å®å
¨æ¯é¢ åäºå æå
³ç³»ï¼å¦æ没æ好ç¨çè¯æ³ï¼æä¹è½ååºå¥½ç¨çåºå¢ï¼è¦æ¾ä¾åä¹å¾ç®åï¼åªè¦æ¯è¾ä¸ä¸JavaåC#å°±å¤äºãC#çåºä¹æ以好ç¨ï¼è·ä»è¯è¨ç表达è½å强æ¯åä¸å¼çï¼è¬å¦è¯´linqï¼ï¼to xmlï¼to sqlï¼to parserï¼etcï¼ï¼è¬å¦è¯´WCFï¼ä»
èèæç¨æ§é¨åï¼ï¼è¬å¦è¯´WPFãJavaè½åå¾åºæ¥è¿äºåºåï¼ç¡¬è¦åè¿æ¯å¯ä»¥åçï¼ä½æ¯ä½ ä¼åç°ä½ æ 论å¦ä½é½æ²¡åæ³æä»ä»¬åå°ç¨èµ·æ¥å¾é¡ºæçæ ·åï¼å
¶å®è¿é½æ¯å 为Javaçè¯æ³åå¾é æçãè¿ä¸ªæ¶åå¯ä»¥æ¬å¤´çä¸çæä¸é¢ååºæ¥çäºç§è¯è¨ï¼ä»ä»¬çç¹ç¹é½æ¯ââå 为è¯æ³çåå ï¼åºç¨èµ·æ¥ç¹å«ç½ã
ããå½ç¶ï¼è¿å¹¶ä¸è¦æ±ææç人é½åºè¯¥æè¯è¨å¦ä¹ å°å¯ä»¥å»ååºãç¨åºåçåå¸ä¹æ¯è·éåå¡çç»æä¸æ ·çï¼åºè®©å°æ°äººå»å就好äºï¼å¤§å¤æ°äººå°½ç®¡ç¨ï¼ä¹ä¸ç¨å¦é£ä¹å¤ï¼é¤éä½ ä»¬æ³æ为ååºçé£äºãä¸è¿æè¿æä¸ä¸ªå¾ä¸å¥½çé£æ°ï¼å°±æ¯æäºäººè§å¾ä¸ä¸ªè¯è¨é¾å°èªå·±æ æ³ãè½»æ¾ãæ为ååºç人ï¼å°±å¼å§è¯´ä»è¿éä¸å¥½é£éä¸å¥½äºï¼å
·ä½é½æ¯è°æå°±ä¸ç¹åäºï¼å¤§å®¶é½ç¥éï¼åµåµåµã
ãã好çè¯è¨ï¼é¤äºåºåèµ·æ¥å容æå好ç¨ä»¥å¤ï¼è¿æ两个éè¦çç¹ç¹ï¼å®¹æå¦ï¼å®¹æåæãå
³äºå®¹æå¦è¿ä¸ç¹ï¼å
¶å®ä¸æ¯è¯´ï¼ä½ é便çä¸çå°±è½å¦ä¼ï¼èæ¯è¯´ï¼åªè¦ä½ ææ¡äºé¨éï¼å¾å¤æªç¥çç¹æ§ä½ é½å¯ä»¥çä¸ãè¿å°±æä¸ä¸ªè¯æ³çä¸è´æ§é®é¢å¨éé¢äºãè¯æ³çä¸è´æ§é®é¢ï¼æ¯ä¸ä¸ªå¾å®¹æ让人忽ç¥çé®é¢ï¼å 为ææå 为è¯æ³çä¸è´æ§ä¸å¥½èå¼åçé误ï¼åå é½ç¹å«çéæ¦ï¼å¾é¾ä¸ç¼çåºæ¥ãè¿éæ为äºè®©å¤§å®¶å¯ä»¥å»ºç«èµ·è¿ä¸ªæ¦å¿µï¼ææ¥ä¸¾å 个ä¾åã
ãã第ä¸ä¸ªä¾åæ¯æ们åé»ä¹è§çCè¯è¨çæéåéå®ä¹å¦ï¼
ããint a, *b, **c;
ããç¸ä¿¡å¾å¤äººé½è¢«è¿ç§ä¸è¥¿åè¿ï¼æ以å¾å¤æç§ä¹¦é½åè¯æ们ï¼å½å®ä¹ä¸ä¸ªåéçæ¶åï¼ç±»åæåçé£äºæå·é½è¦åå¨åéåé¢ï¼é¿å
让人误解ãæ以å¾å¤äººé½ä¼æ³ï¼ä¸ºä»ä¹è¦è®¾è®¡æè¿æ ·å¢ï¼è¿ææ¾å°±æ¯æ个å让人å¾ä¸è·³åãä½æ¯å¨å®é
ä¸ï¼è¿æ¯ä¸ä¸ªè¯æ³çä¸è´æ§å¥½çä¾åï¼è³äºä¸ºä»ä¹ä»æ¯ä¸ªåï¼é®é¢å¨å«çå°æ¹ã
ããæ们é½ç¥éï¼å½ä¸ä¸ªåébæ¯ä¸ä¸ªæåintçæéçæ¶åï¼*bçç»æå°±æ¯ä¸ä¸ªintãå®ä¹ä¸ä¸ªåéint a;ä¹çäºå¨è¯´âå®ä¹aæ¯ä¸ä¸ªintâãé£æ们æ¥çä¸é¢é£ä¸ªåé声æï¼int *b;ãè¿ç©¶ç«æ¯å¨è¯´ä»ä¹å¢ï¼å
¶å®çæ£çæææ¯âå®ä¹*bæ¯ä¸ä¸ªintâãè¿ç§âå®ä¹å使ç¨ç¸ä¸è´âçæ¹æ³å
¶å®æ£æ¯æ们è¦æ¨å´çãCè¯è¨çå½æ°å®ä¹åæ°ç¨éå·åéï¼è°ç¨çæ¶åä¹ç¨éå·åéï¼è¿æ¯å¥½çãPascalè¯è¨çå½æ°å®ä¹åæ°ç¨åå·åéï¼è°ç¨çæ¶åç¨éå·åéï¼è¿ä¸ªä¸è´æ§å°±å°äºä¸ç¹ã
ããçå°è¿éä½ å¯è½ä¼è¯´ï¼ä½ æä¹ç¥éCè¯è¨ä»ç¹å°±æ¯è¿ä¹æ³çå¢ï¼æèªå·±è§å¾å¦æä»ä¸æ¯è¿ä¹æ³ç估计ä¹ä¸ä¼å·®å°åªéå»ï¼å 为è¿æä¸é¢ä¸ä¸ªä¾åï¼
ããint F(int a, int b);
int (*f)(int a, int b);
ããè¿ä¹æ¯ä¸ä¸ªâå®ä¹å使ç¨ç¸ä¸è´âçä¾åã就第ä¸è¡ä»£ç æ¥è¯´ï¼æ们è¦å¦ä½çå¾
âint F(int a, int b);âè¿ä¸ªåæ³å¢ï¼å
¶å®è·ä¸é¢ä¸æ ·ï¼ä»è¯´çæ¯âå®ä¹F(a, b)çç»æ为intâãè³äºaåbæ¯ä»ä¹ï¼ä»ä¹åè¯ä½ ï¼å®ä¹a为intï¼bä¹ä¸ºintãæ以çä»·çï¼ä¸é¢è¿ä¸è¡ä¹æ¯âå®ä¹(*f)(a, b)çç»æ为intâãå½æ°ç±»åå
¶å®ä¹æ¯å¯ä»¥ä¸ååæ°åçï¼ä¸è¿æ们è¿æ¯é¼å±æåæ°ååè¿å»ï¼è¿æ ·Visual Studioçintellisenseä¼è®©ä½ å¨æ²â(âçæ¶åæåæ°åç»ä½ ååºæ¥ï¼ä½ çå°äºæ示ï¼ææ¶åå°±ä¸éè¦åå»ç¿»æºä»£ç äºã
ããå
³äºCè¯è¨çâå®ä¹å使ç¨ç¸ä¸è´âè¿ææåä¸ä¸ªä¾åï¼è¿ä¸ªä¾åä¹æ¯å¾ç¾å¦çï¼
ããint a;
typedef int a;
int (*f)(int a, int b);
typedef int (*f)(int a, int b);
ããtypedefæ¯è¿æ ·çä¸ä¸ªå
³é®åï¼ä»æä¸ä¸ªç¬¦å·ä»åéç»ä¿®æ¹æäºç±»åãæ以æ¯å½ä½ éè¦ç»ä¸ä¸ªç±»ååä¸ä¸ªååçæ¶åï¼å°±å
æ³ä¸æ³ï¼æä¹å®ä¹ä¸ä¸ªè¿ä¸ªç±»åçåéï¼ååºæ¥ä¹åå¾åé¢å 个typedefï¼äºæ
å°±å®æäºã
ããä¸è¿è¯´å®è¯ï¼å°±ä¸è´æ§æ¥è®²ï¼Cè¯è¨ä¹å°±å°æ¤ä¸ºæ¢äºãè³äºè¯´ä¸ºä»ä¹ï¼å 为ä¸é¢è¿å æ¡çèµ·æ¥å¾ç¾å¥½çâå®ä¹å使ç¨ç¸ä¸è´âçè§åæ¯ä¸è½ç»åçï¼è¬å¦è¯´çä¸é¢è¿ä¸è¡ä»£ç ï¼
ããtypedef int(__stdcall*f[10])(int(*a)(int, int));
è¿ç©¶ç«æ¯ä¸ªä»ä¹ä¸è¥¿å¢ï¼è°çå¾æ¸
æ¥åï¼èä¸è¿ä¹æ²¡åæ³ç¨ä¸é¢çæ¹æ³æ¥è§£éäºã究å
¶åå ï¼å°±æ¯Cè¯è¨éç¨çè¿ç§âå®ä¹å使ç¨ç¸ä¸è´âçææ³å好æ¯ä¸ç§è§£æ¹ç¨çææ³ãè¬å¦è¯´int *b;å®ä¹äºâ*bæ¯intâï¼é£bæ¯ä»ä¹å¢ï¼æ们çå°äºä¹åï¼é½å¾æ³ä¸æ³ã人类çç´è§æ¯æè¯ç´è¯´å¼é¨è§å±±ï¼æ以å¦ææ们ç¥éint*æ¯intçæéï¼é£ä¹int* bä¹å°±å¾æ¸
æ¥äºâââbæ¯intçæéâã
å 为Cè¯è¨çè¿ç§åæ³è¿åäºäººç±»çç´è§ï¼æ以è¿æ¡æ¬æ¥å¾å¥½çååï¼éç¨äºé误çæ¹æ³æ¥å®ç°ï¼ç»æ就导è´äºâåâçåºç°ãå 为大家é½ä¹ æ¯âint* a;âï¼ç¶åCè¯è¨åè¯å¤§å®¶å
¶å®æ£ç¡®çåæ³æ¯âint *a;âï¼é£ä¹å½ä½ æ¥è¿çåºç°ä¸¤ä¸ä¸ªåéçæ¶åï¼é®é¢å°±æ¥äºï¼ä½ å°±æåéå»äºã
ããè¿ä¸ªæ¶åæ们åå头çä¸çä¸é¢é£ä¸æ®µé¿é¿çå½æ°æéæ°ç»åéç声æï¼ä¼åç°å
¶å®å¨è¿ç§æ¶åï¼Cè¯è¨è¿æ¯å¸æä½ æå®çæâint* b;âçè¿ç§å½¢å¼çï¼fæ¯ä¸ä¸ªæ°ç»ï¼æ°ç»è¿åäºä¸ä¸ªå½æ°æéï¼å½æ°è¿åintï¼å½æ°çåæ°æ¯int(*a)(int, int)æ以ä»è¿æ¯ä¸ä¸ªå½æ°æéã
ããæ们为ä»ä¹ä¼è§å¾Cè¯è¨å¨è¿ä¸ä¸ªç¥è¯ç¹ä¸ç¹å«çé¾å¦ï¼å°±æ¯å 为ä»åæ¶æ··ç¨äºä¸¤ç§ååæ¥è®¾è®¡è¯æ³ãé£ä½ 说好ç设计æ¯ä»ä¹å¢ï¼è®©æ们æ¥ççä¸äºå
¶å®çè¯è¨çä½æ³ï¼
ããC++:
function<int __stdcall(function<int(int, int)>)> f[10];
C#:
Func<Func<int, int, int>, int>[] f;
Haskell:
f :: [(int->int->int)->int]
Pascal:
var f : array[0..9] of function(a : function(x : integer; y : integer):integer):integer;
ãã
ããè¿äºè¯è¨çåæ³ï¼è½ç¶å¹¶æ²¡æéµå®âå®ä¹å使ç¨ç¸ä¸è´âçååï¼ä½æ¯ä»ä»¬æ¯Cè¯è¨å¥½çå°æ¹å¨äºï¼ä»ä»¬åªéç¨ä¸ç§ååââè¿å°±æ¯å¥½çååçæ··å¨ä¸èµ·è¦å¼ºå¤äºï¼è¿ä¸ç¹goä¹æ¯ï¼åå¾æ¯Cè¯è¨æ´ç³ç³ï¼ã
ããå½ç¶ï¼ä¸é¢è¿ä¸ªè¯´æ³å¯¹Haskellæ¥è¯´å
¶å®å¹¶ä¸å
¬å¹³ãHaskellæ¯ä¸ç§å¸¦æå®å
¨ç±»åæ¨å¯¼çè¯è¨ï¼ä»ä¸è®¤ä¸ºç±»å声ææ¯å£°æçä¸é¨åï¼ä»æç±»å声æå½ææ¯âæ示âçä¸é¨åãæ以å®é
ä¸å½ä½ ççéè¦ä¸ä¸ªè¿ç§å¤æç»æçå½æ°çæ¶åï¼å®é
ä¸ä½ 并ä¸ä¼ççå»æå®çç±»åååºæ¥ï¼èæ¯éè¿åä¸ä¸ªæ£ç¡®çå½æ°ä½ï¼ç¶å让Haskellç¼è¯å¨å¸®ä½ æ¨å¯¼åºæ£ç¡®çç±»åãææ¥ä¸¾ä¸ªä¾åï¼
ããsuperApply fs x = (foldr id (.) fs) x
ãã
ããå
³äºfoldræä¸ä¸ªå¾å¥½çç解æ¹æ³ï¼è¬å¦è¯´foldr 0 (+) [1,2,3,4]说çå°±æ¯1 + (2 + (3 + (4 + 0)))ãè(.)å
¶å®æ¯ä¸ä¸ªæ两个å½æ°å并æä¸ä¸ªçå½æ°ï¼f (.) g = \x->f(g( x ))ãæ以ä¸è¿°ä»£ç çææå°±æ¯ï¼å¦æææä¸é¢çä¸ä¸ªå½æ°ï¼
ããadd1 x = x + 1
mul2 x = x * 2
sqr x = x * x
ãã
ããé£ä¹å½æåä¸ä¸é¢ç代ç çæ¶åï¼
ããsuperApply [sqr, mul2, add1] 1
çæ¶åï¼ä»åçå
¶å®æ¯sqr(mul2(add1(1)) = ((1+1)*2) * ((1+1)*2) = 16ãå½ç¶ï¼Haskellè¿å¯ä»¥åå¾æ´ç´ç½ï¼
superApply [(\x->x*x), (*2), (+1)] 1
ãã
ããHaskell代ç çç®æ´ç¨åº¦çæ¯ä¸§å¿ç
çåï¼å 为å¦ææ们è¦ç¨C++æ¥ååºå¯¹åºçä¸è¥¿çè¯ï¼Cè¯è¨çåæ°æ æ³æ¯ä¸ä¸ªå¸¦é¿åº¦çæ°ç»ç±»åæ以å
¶å®æ¯åä¸åºçä»·çä¸è¥¿çï¼ï¼ä¼åæä¸é¢è¿ä¸ªæ ·åï¼
ããtemplate<typename T>
T SuperApply(const vector<function<T(T)>>& fs, const T& x)
{
T result = x;
for(int i=fs.size()-1; i>=0; i--)
{
result = fs[i](result);
}
return result;
}
ãã
ããC++ä¸ä»
è¦ææ¯ä¸ä¸ªæ¥éª¤åå¾å¾æ¸
æ¥ï¼èä¸è¿è¦æç±»åæè¿°åºæ¥ï¼æ´ä¸ªä»£ç å°±åå¾ç¹å«çæ··ä¹±ãé¤æ¤ä¹å¤ï¼C++è¿æ²¡åæ³è·Haskellä¸æ ·å§ä¸ä¸ªå½æ°ç´æ¥ææä¸ä¸ªvectorç¶åéè¿è¿ä¸ªSuperApplyéé¢ç´æ¥è°ç¨ãå½ç¶æ人ä¼è¯´ï¼è¿è¿ä¸æ¯å 为Haskelléé¢æfoldråãé£è®©æ们æ¥ççåæ ·æfoldrï¼reverse + aggregate = foldrï¼çC#ä¼æä¹åï¼
ããT SuperApply<T>(Func<T, T>[] fs, T x)
{
return (fs
.Reverse()
.Aggregate(x=>x, (a, b)=>y=>b(a(y)))
)(x);
}
ãã
ããC#åºæ¬ä¸å·²ç»è¾¾å°è·Haskellä¸æ ·çæè¿°è¿ç¨äºï¼èä¸ä¹å¯ä»¥ååºä¸é¢ç代ç äºï¼å°±æ¯æ 论声æå使ç¨çè¯æ³çåªé³ç¨å¾®æç¹å¤§â¦â¦
ããSuperApply(new Func<T, T>[]{
x=>x*x,
x=>x*2,
x=>x+1
}, 1);
ãã
ãã为ä»ä¹è¦å¨è®¨è®ºè¯æ³çä¸è´æ§çæ¶å说è¿äºé®é¢å¢ï¼å¨è¿éææ³å大家å±ç¤ºHaskellçå¦ä¸ç§âå®ä¹å使ç¨ç¸ä¸è´âçåæ³ãHaskellæ´ä¸ªè¯è¨é½è¦ç¨pattern matchingå»ç解ï¼æ以ä¸é¢çè¿æ®µä»£ç
ããsuperApply fs x = (foldr id (.) fs) x
说çæ¯ï¼å¡æ¯ä½ åºç°ç±»ä¼¼superApply a bçè¿ç§âpatternâï¼ä½ é½å¯ä»¥æå®å½æ(foldr id (.) a) bæ¥çãè¬å¦è¯´
superApply [(\x->x*x), (*2), (+1)] 1
å
¶å®å°±æ¯
(foldr id (.) [(\x->x*x), (*2), (+1)]) 1
åªè¦superApplyæçæ¯è¿ä¸ªå½æ°ï¼é£æ 论å¨ä»ä¹ä¸ä¸æéé¢ï¼ä½ é½å¯ä»¥æ¾å¿çåè¿ç§æ¿æ¢èç¨åºçææç»å¯¹ä¸ä¼æååââè¿å°±æ¯haskellç带æä¸è´æ§çååãé£è®©æ们æ¥ççHaskellæ¯å¦ä½æ§è¡ä»è¿ä¸ªä¸è´æ§çãå¨è¿éæ们éè¦ç¥éä¸ä¸ªä¸è¥¿ï¼å°±æ¯å¦ææ们æä¸ä¸ªæä½ç¬¦+ï¼é£æ们è¦æ+å½æå½æ°æ¥çï¼æ们就è¦å(+)ãå¦ææ们æä¸ä¸ªå½æ°fï¼å¦ææ们è¦æå®å½ææä½ç¬¦æ¥çï¼é£å°±è¦åæ`f`ï¼è¿æ¯æé®ï¼å·¦è¾¹çé£ä¸ªç¬¦å·ï¼ãå æ¤Haskellå
¶å®å
许æ们åä¸é¢ç声æï¼
(Point x y) + (Point z w) = Point (x+z) (y+w)
(+) (Point x y) (Point z w) = Point (x+z) (y+w)
(Point x y) `Add` (Point z w) = Point (x+z) (y+w)
Add (Point x y) (Point z w) = Point (x+z) (y+w)
ãã
ããææ³¢é£å¥æ°åçç®åå½¢å¼çè³è¿å¯ä»¥è¿ä¹åï¼
ããf 1 = 1
f 2 = 1
f (n+2) = f(n+1) + f(n)
ãã
ããçè³è¿éå½é½å¯ä»¥åæï¼
ããGetListLength [] = 0
GetListLength (x:xs) = 1 + GetListLength xs
ãã
ããHaskellå°å¤é½è´¯å½»äºâå½æ°åæä½ç¬¦çæ¿æ¢å
³ç³»âåâpattern matchingâ两个ååæ¥åâå®ä¹åå®ç°ç¸ä¸è´âçåºç¡ï¼ä»èå®ç°äºä¸ä¸ªæ¯Cè¯è¨é£ä¸ªåäºä¸åçæ··ä¹±çååè¦å¥½å¾å¤çååã
ããæäºäººå¯è½ä¼è¯´ï¼Haskellåéå½è¿ä¹å®¹æï¼é£ä¼ä¸ä¼å 为é¼å±äººä»¬åéå½ï¼èæ´ä¸ªç¨åºå
满äºéå½ï¼å¾å®¹æstack overflowæè
éä½è¿è¡æçå¢ï¼å¨è¿éä½ å¯ä»¥å¾ä¸ç¿»ï¼å¨è¿ç¯æç« çåé¢æä¸å¥è¯â好çè¯è¨ï¼é¤äºåºåèµ·æ¥å容æå好ç¨ä»¥å¤ï¼è¿æ两个éè¦çç¹ç¹ï¼å®¹æå¦ï¼å®¹æåæãâï¼è¿å¨Haskelléé¢ä½ç°å¾æ·æ¼å°½è´ã
ããæ们ç¥é循ç¯å°±æ¯å°¾éå½ï¼æ以å¦ææ们æ代ç åæå°¾éå½ï¼é£Haskellçç¼è¯å¨å°±ä¼è¯å«åºæ¥ï¼ä»èå¨çæx86代ç çæ¶åæå®å¤çæ循ç¯ãä¸ä¸ªå°¾éå½éå½å½æ°çéåºç¹ï¼è¦ä¹æ¯ä¸ä¸ªä¸å
å«èªèº«å½æ°è°ç¨ç表达å¼ï¼è¦ä¹å°±æ¯ç¨èªèº«å½æ°æ¥åå
¶å®åæ°æ¥è°ç¨ãå¬èµ·æ¥æ¯è¾æå£ï¼ä¸è¿è¯´ç½äºå
¶å®å°±æ¯ï¼
ããGetListLength_ [] c = c
GetListLength_ (x:xs) c = GetListLength_ xs (c+1)
GetListLength xs = GetListLength_ xs 0
ãã
ããå½ä½ ååºè¿æ ·ç代ç çæ¶åï¼Haskellæä½ ç代ç ç¼è¯äºä¹åï¼å°±ä¼ççè¾åºä¸ä¸ªå¾ªç¯ï¼ä»èä¸é¢çæ
å¿é½ä¸æ«è空ã
ããå®é
ä¸ï¼æå¾å¤æ§è½æµè¯é½è¡¨æï¼å¨å¤§å¤æ°å¹³å°ä¸ï¼Haskellçé度ä¹ä¸ä¼è¢«C/C++æ
¢è¶
è¿ä¸åçåæ¶ï¼è¦è¿æ¯goçæ§è½é«åºè®¸å¤ãå¨Windowsä¸ï¼å½æ°å¼è¯è¨æå¿«çæ¯F#ãLinuxä¸åæ¯ScalaãHaskellä¸ç´é½æ¯ç¬¬äºåï¼ä½æ¯åªæ¯ç¬¬ä¸åæ
¢ä¸ç¹ç¹ã
ãã为äºä¸è®©æç« å¤ªé¿ï¼å¥½åæè¥å¹²æ¬¡åå¸ï¼æ¯æ¬¡é´éé½è¾çï¼æ以ä»å¤©çåæåªæ³å¤è®²ä¸ä¸ªââC++çæéçåãå©ä¸çåçå°ä¸ä¸ç¯æç« éé¢ãä¸é¢è¦è®²çè¿ä¸ªåï¼å¦æä¸æ¯å¨ç²ä¸ç¾¤éé¢è¢«é®äºï¼æè¿ä¸ç¥éæ人ä¼è¿ä¹åï¼
ããclass Base
{
...
};
class Derived : public Base
{
...
};
Base* bs = new Derived[10];
delete[] bs;
ãã
ããææ³è¯´ï¼è¿å®å
¨æ¯C++å
¼å®¹Cè¯è¨ï¼ç¶å让Cè¯è¨ç»åäºãå
¶å®è¿ä¸ªé®é¢å¨Cè¯è¨éé¢æ¯ä¸ä¼åºç°çï¼å 为Cè¯è¨çæéå
¶å®è¯´ç½äºåªæä¸ç§ï¼char*ãå¾å¤Cè¯è¨çå½æ°é½æ¥åchar*ï¼void*è¿æ¯åæ¥ææçãCè¯è¨æä½æéç¨çmallocåfreeï¼å
¶å®ä¹æ¯æä»å½char*å¨çãæ以å½ä½ mallocäºä¸ä¸ªä¸è¥¿ï¼ç¶åcastæä½ éè¦çç±»åï¼æåfreeæï¼è¿ä¸æ¥caståå¨ä¸åå¨å¯¹äºfreeè½å¦æ£ç¡®æ§è¡æ¥è¯´æ¯æ²¡æåºå«çã
ããä½æ¯äºæ
å°äºC++å°±ä¸ä¸æ ·äºãC++æ继æ¿ï¼æäºç»§æ¿å°±ææéçéå¼ç±»å转æ¢ãäºæ¯çä¸é¢ç代ç ï¼æ们new[]äºä¸ä¸ªæéæ¯Derived*ç±»åçï¼ç¶åéå¼è½¬æ¢å°äºBase*ãæåæ们æ¿ä»delete[]ï¼å 为delete[]éè¦è°ç¨ææå½æ°ï¼ä½æ¯Base*ç±»åçæéå¼ä¸è½æ£ç¡®è®¡ç®åºDerivedæ°ç»ç10个ææå½æ°éè¦çthisæéçä½ç½®çï¼æ以å¨è¿ä¸ªæ¶åï¼ä»£ç å°±å®èäºï¼å¦æ没å®èï¼é£åªæ¯å·§åï¼ã
ãã为äºå
¼å®¹Cè¯è¨ï¼ânew[]çæééè¦delete[]âåâåç±»æéå¯ä»¥è½¬ç¶ç±»æéâç两æ¡è§åæåçå²çªå°äºä¸èµ·ãå®é
ä¸ï¼å¦æéè¦è§£å³è¿ç§é®é¢ï¼é£ç±»ååºè¯¥æä¹æ¹å¢ï¼å
¶å®æ们å¯ä»¥è·C#ä¸æ ·å¼å
¥Derived[]çè¿ç§æéç±»åãè¿è¿æ¯new[]åºæ¥çä¸è¥¿ï¼C++éé¢ä¹å¯ä»¥è¦æ±delete[]ï¼ä½æ¯åºå«æ¯ä»åä¹ä¸è½è½¬æBase[]äºãåªå¯æï¼T[]è¿ç§ç±»å被Cè¯è¨å ç¨äºï¼å¨å½æ°åæ°ç±»åéé¢å½T*ç¨ãCè¯è¨æµªè´¹è¯æ³ç½ªè¯¥ä¸æ»åâ¦â¦
温馨提示:答案为网友推荐,仅供参考