我遇到了一种我认为可以更优雅地表达的模式:
我有两个功能f1,f2 :: Int -> Int
(它们的含义不相关),一个process :: Int -> Int
执行以下操作:
- 如果
f1 x
产生的结果x1
与 不同x
,则重复该过程x1
- 否则,如果
f2 x
产生x2
不同于x
,则重复该过程x2
- 最后,停止进程并返回
x
我的case ... of
实现如下:
f1 :: Int -> Int
f1 = undefined
f2 :: Int -> Int
f2 = undefined
process :: Int -> Int
process x =
case f1 x of
x ->
case f2 x of
x -> x
x' -> process x'
x' -> process x'
这会产生以下警告:
so.hs:13:17: warning: [-Woverlapping-patterns]
Pattern match is redundant
In a case alternative: x' -> ...
|
13 | x' -> process x'
| ^^^^^^^^^^^^^^^^
so.hs:14:9: warning: [-Woverlapping-patterns]
Pattern match is redundant
In a case alternative: x' -> ...
|
14 | x' -> process x'
| ^^^^^^^^^^^^^^^^
任何人都可以阐明哪些模式是重叠的,以及如何process
更优雅地实现?