[英]Primitive Recursion If Then Else actually executing If Else Then
我對If If Else的定義中的預測有疑問。 它實際上是以If-Else-Then的身份執行的。
import Prelude hiding (pred,and,or,not)
data PR = Z
| S
| P Int
| C PR [PR]
| PR PR PR
deriving Show
eval :: PR -> [Integer] - Integer
eval Z _ = 0
eval S [x] = x+1
eval (P n) xs = nth n xs
eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
eval (PR g h) (0:xs) = eval g xs
eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)
nth _ [] = error "nth nil"
nth 0 _ = error "nth index"
nth 1 (x:_) = x
nth (n) (_:xs) = nth (n-1) xs
one = C S [Z]
plus = PR (P 1) (C S [P 2])
ife = PR (P 1) (C (P 2) [P 3, P 4])
如果我嘗試交換P 3
和P 4
它將完全中斷(每次都返回'then'值)。 ite[0,2,3]
應該返回3
而ite[1,2,3]
應該返回2
。 相反,情況正相反。 我該如何糾正?
你覺得這堂課怎么樣? 我注意到您和我有非常相似的作業,非常相似。
首先,您想創建一個模仿IF-Then-Else模型的基本遞歸函數。 因此,
eval ite [0,1,2] => 1
和
eval ite [1,2,3] => 3
根據您提供的內容,在相反的情況下(取決於第一個輸入),您似乎正在獲得具有相同質量的功能。
ife = PR (P 1) (C (P 2) [P 3, P 4])
現在您的功能在說什么? 您的ITE實施使用原始遞歸構造,這是一個開始,因為在此情況下,您可以根據條件將執行分為兩個不同的表達式。 布爾代數中使用的條件相同。 如果為0,則為false;否則,如果數字為任意值(0 <),則為true。 如果“堆棧”的頭為0,PR構造會通過評估其第一個參數來執行此操作,否則它會評估其第二個參數,以期希望沿該行的某個位置終止(通常是將頭作為計數器遞減,最終執行第一個參數)。 但是出於所有意圖和目的,我們可以說第二個表達式將在(0 <)上執行。
! 那么,我們如何解決您的實施問題呢? 簡單:
ife = PR (P 2) (C (P 1) [P 3, P 4])
我們將您的兩個投影切換,因為您只是將它們向后移動。 如果堆棧的頭是Z,我們要投影第二個表達式,否則我們投影第一個表達式。 或更好:
ite = PR (P 2) (P 1)
我認為,我也沒有完成作業,如果我錯了,我將不勝感激。
由於我沒有足夠的能力發表評論,因此我將其留在這里。
我認為應該
ife = PR (P 1) (C (P 2) [P 3, P 3])
^
而不是原始版本
ife = PR (P 1) (C (P 2) [P 3, P 4])
^
如果第一個值不為0,否則將選擇X。否則,將不返回任何隨機值。 它還使寫作和/或/ ...更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.