Haskell功能守护者如何操作其他值而不是函数参数?

前端之家收集整理的这篇文章主要介绍了Haskell功能守护者如何操作其他值而不是函数参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
http://lisperati.com/haskell/ht4.html作者显示从一个简单的SVG文件读取多边形的功能.我理解大多数代码,但是我想知道是否可以重写该函数
let readPoint :: String -> Point
      readPoint s | Just [x,y] <- matchRegex (mkRegex "([0-9.]+),([0-9.]+)") s = (read x,read y)

在一个更容易理解的形式.我发现线路有点令人费解,因为守卫应该对功能的参数进行操作(在这种情况下是“readPoint”),但是这里的守卫显然是对matchRegex的结果进行操作的.

那么任何人都可以解释这背后的魔法?

这可以改写成更容易理解的形式吗?

解决方法

你可以把守卫看作if语句的语法糖.守卫中的表达式可以是任何有效的布尔表达式,就像在if语句中一样.这意味着您可以在范围内使用任何值和函数.

例如,您可以重写以下内容

foo x | abc = ...
      | def = ...
      | otherwise = ...

foo x = if abc then ... else if def then ... else ...

我们也可以用case更详细地写下来,而不是如下:

foo x = case abc of
  True -> ...
  False -> case def of
    True -> ...
    False -> ...

毕竟,如果自己只是一个案例的语法糖!根据案例编写所有内容,可以更轻松地看到不同功能对于同一件事情而言只是语法糖.

即使条件参考现有变量(abc和def)而不是函数参数x,第二个表达式也是有意义的.守卫只是一样的工作.

你的例子有点复杂,因为它使用了一个名为“pattern guards”的扩展.这意味着防护不仅仅是一个布尔值,它也可以尝试匹配一个模式.如果模式匹配,防守成功(例如,与真正的守卫相同);否则,后卫无法匹配(就像获得False).

我们可以想象如下重写:

readPoint s | Just [x,y] <- matchRegex (mkRegex "...") s = ...
            | otherwise = ...

readPoint s = case matchRegex (mkRegex "...") s of
                Just [x,y] -> ...
                _ -> ...

您可以看到这个和正常守卫的案例版本之间的平行.模式守卫只是将任意模式延伸到任意模式,而不仅仅是布尔值.

再次,我相信你会同意在case语句中允许任何表达式是有意义的 – 没有理由将它限制为使用函数的参数.卫兵也是如此,因为他们只是语法糖.

猜你在找的Java相关文章