我的函数的 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)
以下是我所做的事情:
使用模式匹配。在你的第二个解决方案中,你已经对空列表进行了模式匹配,所以这更进一步并且在非空列表(x::xs
)上进行模式匹配,使用 hd
和 tl
不需要。
当您不需要值时使用 _
模式。
而不是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)
此函数的更短语法是什么?我注意到很多程序员在他们的函数中使用管道,但我一直在努力弄清楚如何为这个函数做同样的事情。
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)
以下是我所做的事情:
使用模式匹配。在你的第二个解决方案中,你已经对空列表进行了模式匹配,所以这更进一步并且在非空列表(
x::xs
)上进行模式匹配,使用hd
和tl
不需要。当您不需要值时使用
_
模式。而不是
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)