我的函数的SML较短的基本案例语法

时间:2019-01-18 04:50:07

标签: functional-programming sml smlnj

此功能的简短语法是什么?我注意到很多程序员在其函数中使用管道,但是我一直在努力弄清楚如何为此使用相同的管道。

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

2 个答案:

答案 0 :(得分:1)

这是一个简短的版本:

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

这是我做的事情:

  1. 使用模式匹配。在您的第二个解决方案中,您已经对空列表进行了模式匹配,因此可以更进一步,并在非空列表(x::xs)上进行模式匹配,并使用hd和{ {1}}不需要。

  2. 在不需要该值时,请使用tl模式。

  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)

答案 1 :(得分:0)

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

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