【发布时间】:2020-01-09 12:39:34
【问题描述】:
在 Haskell 中编程时有时会遇到一个问题,有时我想将模式与值匹配,但我只对值是否与模式匹配的真假信息感兴趣(例如,特定的数据类型构造函数)。例如:
data Color =
RGB Int Int Int
| Greyscale Int
toHex :: Color -> String
toHex color =
if isGreyscale color then something
else somethingElse
where
isGreyscale :: Color -> Bool
isGreyscale (Greyscale _) = True
isGreyscale _ = False
而我想在不创建不必要的辅助功能的情况下进行模式匹配,类似于:
toHex :: Color -> String
toHex color =
if (color ~~ (Greyscale _)) then something
else somethingElse
是否有特定的语法允许类似于上面的示例?或者在这种情况下会派上用场的成语?
【问题讨论】:
-
除非我们已经有一个布尔值,否则
if通常是非常糟糕的,因为它迫使我们获取丰富的数据并剥离所有内容,直到我们有一个布尔值。if condition本质上是一个非常有限的case condition of True -> ... ; False -> ...,与一般的case不同,它从不将值绑定到变量——这是模式匹配的关键部分。在您的情况下,要获得布尔值,您将丢弃Grayscale value中的value,而case会保留它。不要为boolean blindness受苦! -
您可能会感兴趣:A Crossroad at a Branch.
-
一个丑陋但偶尔有用的成语:
if null [ () | Greyscale _ <- color ] ...
标签: haskell functional-programming algebraic-data-types