初学者:F#中的表达式

3

I want to rewrite this

//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;

不使用 "in"

我想到了这个

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

说let未完成并期望一个表达式。

不确定为什么。 mx2应该获取集合的较高值并将其移动到其范围内的下一个函数。

我还希望能够这样做,以便我不使用任何let表达式。请帮助理解这种语言,谢谢。

编辑:有人可以回答我的下面问题吗?此外,在F#中是否可能出现这样的问题而不使用任何let表达式?

2个回答

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
哦,原来如此简单。为什么我不能将mx1的第一个返回值传递到下一个辅助函数中呢? - SuperCell

3

提示 let 未完成,需要一个表达式。不确定原因。mx2应该获取集合中较高的值并将其移动到下一个函数中。

关于这个问题。每个函数都必须返回某个值。函数中的最后一个“表达式”被视为该函数的返回值。

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 以返回该值。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接