第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過具有不同數(shù)量參數(shù)的方程式定義函數(shù)

通過具有不同數(shù)量參數(shù)的方程式定義函數(shù)

我今天注意到這樣的定義safeDivide x 0 = xsafeDivide = (/)不可能。我很好奇這背后的(好的)原因是什么。必須有一個非常好的(畢竟是Haskell :)。注意:我不是在尋找上面代碼的替代實現(xiàn)的建議,這是一個簡單的例子來說明我的觀點。
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經(jīng)驗 獲得超7個贊

我認為這主要是為了保持一致性,以便可以以相同的方式讀取所有子句;可以這么說。也就是說,每個RHS在功能類型中都位于相同的位置。如果您允許的話,我認為也會掩蓋很多愚蠢的錯誤。


還有一個語義上的怪癖:說編譯器填充了這些子句,使其具有與其他子句相同數(shù)量的模式;即你的例子將成為


safeDivide x 0 = x

safeDivide x y = (/) x y

現(xiàn)在考慮第二行是否改為safeDivide = undefined;在沒有上一個子句的情況下,safeDivide它將是⊥,但是由于此處執(zhí)行了eta擴展,所以它是\x y -> if y == 0 then x else ⊥-因此safeDivide = undefined實際上并沒有定義safeDivide為⊥!國際海事組織,這似乎足以使人們有理由禁止此類條款。


查看完整回答
反對 回復 2019-11-02
?
GCT1015

TA貢獻1827條經(jīng)驗 獲得超4個贊

具有多個子句的函數(shù)的含義由Haskell標準(第4.4.3.1節(jié))通過轉(zhuǎn)換為lambda和case語句來定義:


fn pat1a pat1b = r1

fn pat2a pat2b = r2

變成


fn = \a b -> case (a,b) of

  (pat1a, pat1b) -> r1

  (pat2a, pat2b) -> r2

這樣一來,函數(shù)定義/ case語句的處理方式就很好并且保持一致,并且沒有多余地且混亂地指定每個函數(shù)的含義。


僅當每個子句具有相同數(shù)量的參數(shù)時,這種翻譯才真正有意義。當然,可能會有其他規(guī)則來解決此問題,但是它們會使翻譯復雜化,但收效甚微,因為您可能不想為了讀者的利益而定義這樣的內(nèi)容。


查看完整回答
反對 回復 2019-11-02
?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

Haskell之所以這樣做,是因為它的前輩(如LML和Miranda)做到了。沒有技術(shù)原因必須如此。具有較少參數(shù)的方程式可以進行eta展開。但是對于不同的方程式使用不同數(shù)量的參數(shù)可能是一種錯字而不是有意的,因此在這種情況下,我們禁止在某些情況下明智且罕見的做法,以便在常見情況下獲得更好的錯誤報告。


查看完整回答
反對 回復 2019-11-02
  • 3 回答
  • 0 關(guān)注
  • 579 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號