我的函数的 SML 更短的基本语法

SML shorter base case syntax for my function

此函数的更短语法是什么?我注意到很多程序员在他们的函数中使用管道,但我一直在努力弄清楚如何为这个函数做同样的事情。

fun test (i, x) = 
  if null x
then false
else
  if hd x = i then true
  else test(i, tl x)
//
val test = fn : ''a * ''a list -> bool

所以我认为我找到了一个很好的解决方案。管道用于定义构造函数,第一个是空情况,当 x 是一个空列表时,第二个是所有其他情况。

fun test (i, []) = false
  | test (i,x)  = if hd x = i then true else test(i, tl x)

这是一个较短的版本:

fun test (_, []) = false
  | test (i, x::xs) = (x = i) orelse test (i, xs)

以下是我所做的事情:

  1. 使用模式匹配。在你的第二个解决方案中,你已经对空列表进行了模式匹配,所以这更进一步并且在非空列表(x::xs)上进行模式匹配,使用 hdtl 不需要。

  2. 当您不需要值时使用 _ 模式。

  3. 而不是if P then true else Q,写P orelse Q

x = i 周围的括号并不是绝对必要的。两个不同的 = 并排看起来有点混乱(一个来自函数定义,另一个是二元运算符),但这也是完全有效的,意思相同:

fun test (_, []) = false
  | test (i, x::xs) = x = i orelse test (i, xs)

或者缩进更方便一点:

fun test (_, []) = false
  | test (i, x::xs) =
      x = i orelse test (i, xs)