2017-09-15 32 views
0

我被賦予了以下幾個問題:定義(&&)使用Lambda表達式

1.

True && True = True 
_ && _ = False 

我寫這作爲條件表達式:

(&&) a b = if a then 
if b then True else False 
else False 

2.

True && b = b 
False && _ = False 

我寫了這是一個條件表達式:

(&&) a b = if a then b else False 

我試圖寫在lambda表達式爲(& &)給出的這兩個定義,但我不完全知道從哪裏開始或如何做到這一點。

+0

你所說的「lambda表達式」是什麼意思? – melpomene

+0

我們給出了這個例子:add x y = x + y,它是一個lambda表達式add = \ x - >(\ y - > x + y) –

回答

1

一般來說,如果

foo bar baz = quux 

那麼這兩個定義

foo = \bar baz -> quux -- OR 
foo = \bar -> \baz -> quux 

是原來基本相同(最多可圍繞通過給一個明確的類型簽名來制定一些語言疣)。你可以選擇你喜歡的任何一個。所以,

(&&) a b = if a then b else False 

也可以寫爲:

(&&) = \a b -> if a then b else False 

你能解決如何做另一個下面這個模式?

2

我不會只直線上升寫答案,因爲這似乎是某種形式的分配/功課。所以我只會解釋一下lambdas是如何工作的。

讓我們一個基本的Lambda和打破它: \a b -> a

箭頭的左側(在這種情況下,B),我們有爭論。這些是傳遞給lambda的。

上的箭頭的右側,我們有輸出(在這種情況下)。所以這個lambda所做的是取兩個值,並給你第一個值。

輸出例如可以是任何表達式,如果我們限制A和B是數字那麼我們可以有這麼myLambda = \a b -> a + bmyLambda 1 2輸出3.

所以你定義轉換爲Lambda表達式只是把你的if then else語句和有那些作爲lambda中的箭頭之後的表達式。

你也可以使用在最初的定義中使用模式匹配你給,轉換至拉姆達與case of聲明。這需要在caseof,然後你提供各種表情取決於什麼值例如被輸出之間的值

case a of 
    True -> something1 
    False -> something2 

所以,給在拉姆達會給你:

\a b -> case a of 
    value1 -> something1 
    value2 -> something2 

爲了完整起見,我會提到,有一個LambdaCase語言的擴展,使您可以簡化:

\a -> case a of 
    value1 -> something1 
    value2 -> something2 

\case 
    value1 -> something1 
    value2 -> something2 

但這不是必要的,我當然不會擔心它作爲初學者。

我希望這可以幫助,隨時要求澄清:)