簡體   English   中英

Haskell“源減少”

[英]Haskell “Source reduction”

我正在修改即將到來的Haskell考試,我不理解過去論文中的一個問題。 谷歌沒有任何用處

fst(x, y) = x
square i = i * i

i)源減少,使用Haskells懶惰評估,表達式:

fst(square(3+4), square 8)

ii)使用嚴格的評估,源減少相同的表達式

iii)說明懶惰評估的一個優點和嚴格評估的一個優點

我不明白什么源減少?

縮減是lambda演算中的一個術語,它涉及一個語義保留變換,用一個等價項代替一個術語。 對於你給出的例子,最重要的減少是

  • 根據其定義替換名稱(將equals替換為equals的實例)。
  • 功能應用程序的Beta減少。

Beta減少是lambda演算中的基本規則,在像Haskell這樣的純粹,懶惰的語言中,它總是保留語義。 測試版規則是:

(\x. e) m

可以用e代替,用m代替x (替換必須避免“捕獲” mx自由實例。)

您的教練很可能希望您將減少量組合如下:

  1. 查找正在應用的函數是名稱的函數應用程序。
  2. 將名稱替換為其定義,這將是lambda抽象。
  3. Beta-減少應用程序。
  4. 一步完成這一切。

請注意,您經常可以選擇減少哪個應用程序; 例如,在你給出的術語中,有兩個squarefst應用程序可以這種方式減少。 (+的應用也可以減少,但涉及常數的減少需要不同的規則。)

從問題中我看到你的導師希望你反復減少每個術語,直到它達到正常形式 ,並且你的教練希望你展示你對不同減少策略的理解。 “源減少”中的“源”一詞是多余的; 減少意味着以某種語言操縱源術語。 我想說的問題如下:

  • 使用與Haskell的惰性求值相對應的約簡策略,將以下表達式減少為弱頭正態形式。 顯示縮減序列中的每個步驟。

  • 使用與嚴格函數語言中的評估相對應的縮減策略,將以下表達式縮減為正常形式。

我可能會選擇不那么靦腆,只是命名減少策略:按需求減少策略和逐個減值策略。

從問題的結構來看,它可能只是意味着“手工評估表達”,例如

head (map primeTest (enumFromTo 1000 2000))

在懶惰(僅在需要時評估)評估,

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= head (primeTest 1000 : map primeTest (enumFromTo 1001 2000))
= primeTest 1000
= False

嚴格(先評價一切)評價

  head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= ...
= head (map primeTest [1000, 1001, ..., 2000])
= head (primeTest 1000 : map primeTest [1001, 1002, ..., 2000])
= head (False : map primeTest [1001, 1002, ..., 2000])
= ...
= head [False, False, ..., False]
= False

我能找到的唯一相關的地方是http://www.cs.bham.ac.uk/internal/modules/2009/11582.html ,其中“source reducation”被列為“編程技術”。 (O_O)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM