2016-01-20 89 views
3

表達式我想改寫這個初學者:在F#

//finds the max of 3 numbers 
let max3 (n1, n2, n3) = let mx1 = if (n1 > n2) then n1 else n2 in if (mx1 > n3) then mx1 else n3; 

沒有 「中的」

使用我想出了這個

let max3 (n1, n2, n3) = 
    let mx1 = 
     if (n1 > n2) 
     then n1 
     else n2 
    let mx2= 
     if (mx1 > n3) 
     then mx1 
     else n3;; 

說咱們還沒有完成,預計表達。

不知道爲什麼。 mx2是Suppost以獲取該集合的較高值並將其移至其範圍內的下一個函數。

我也希望能夠做到這一點,我不使用任何讓表達式。請任何幫助理解這種語言會真的很親切

編輯:任何人都可以回答我的問題?在F#中使用let表達式也可能出現這樣的問題?

回答

5
let max3 (n1, n2, n3) = max n1 (max n2 n3) 
// val max3 : n1:'a * n2:'a * n3:'a -> 'a when 'a : comparison 

max3 (13,4,7) 

最大值是爲2個參數預定義的,可以如上所述組成。 如果你沒有聲明任何類型,它將是一個通用約束,類型'a需要有一個比較函數。

在F#的功能參數通常不是像(N1,N2,N3)的元組, 代替它可以被定義爲

let max3 n1 n2 n3 = max n1 (max n2 n3) 
// val max3 : n1:'a -> n2:'a -> n3:'a -> 'a when 'a : comparison 

max3 13 4 7 
+1

OMG它是如此簡單。爲什麼我無法從mx1獲得第一個返回到下一個輔助功能? – SuperCell

3

設說是未完成的,我們期望的表達式。 不知道爲什麼。 mx2是Suppost以獲取該集合的較高值並將其移至其範圍內的下一個函數。

關於這個具體問題。每個函數都必須返回一些值。函數中的最後一個「表達式」被認爲是該函數的返回值。

let foo a b c = 
    let x = a + b 
    y + c 

這裏,y + c是最後一個表達式,它的值是「返回值」的功能foo

但是,聲明並綁定某個值(let x = a + b)是一個語句,而不是一個表達式,並且它沒有任何值,所以下面的代碼將不會編譯。

let foo a b c = 
    let result = a + b + c 

如果你想在你原來的代碼返回mx2的價值,你必須綁定聲明(let mx2 = ...)轉換成表情:

let max3 (n1, n2, n3) = 
    let mx1 = ... 

    if (mx1 > n3) 
    then mx1 
    else n3 
+1

或者直接在表尾插入'mx2'來返回值。 –