加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:38:42 所属栏目:Java 来源:网络整理
导读:在 http://lisperati.com/haskell/ht4.html作者显示从一个简单的SVG文件读取多边形的功能.我理解大多数代码,但是我想知道是否可以重写该函数 let readPoint :: String - Point readPoint s | Just [x,y] - matchRegex (mkRegex "([0-9.]+),([0-9.]+)") s = (
在 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语句中允许任何表达式是有意义的 – 没有理由将它限制为使用函数的参数.卫兵也是如此,因为他们只是语法糖.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读