首先,我同意汤姆的评论,即您的四行版本没有任何问题。它完全可读。然而,偶尔将 Haskell 函数变成一个内衬是一种有趣的练习。谁知道,你可能会学到一些东西!
此刻你有
fun 1 = 0
fun n | even n = n + fun (n `div` 2)
| otherwise = fun (3 * n + 1)
您始终可以将使用警卫的表达式转换为if
fun 1 = 0
fun n = if even n then n + fun (n `div` 2) else fun (3 * n + 1)
您始终可以将一系列模式匹配转换为 case 表达式:
fun n = case n of
1 -> 0
_ -> if even n then n + fun (n `div` 2) else fun (3 * n + 1)
最后,您可以将 case 表达式转换为if
s 链(实际上,通常这需要一个Eq
实例作为函数的参数,但由于您使用的是Integer
s ,所以没关系)。
fun n = if n == 1 then 0 else if even n then n + fun (n `div` 2) else fun (3 * n + 1)
我想你会同意这比你开始的可读性要差得多。