- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您查看捕获
的示例:
f = expr `catches` [Handler (\ (ex :: ArithException) -> handleArith ex),
Handler (\ (ex :: IOException) -> handleIO ex)]
看起来catches
已经定义了一个自定义机制来匹配模式(两种异常类型)。我是否弄错了,或者这可以概括为允许定义一个可以采用与特定模式匹配的 lambda 函数的函数吗?
编辑:仅供引用,下面是捕获量的 GHC 来源。如果有人可以阐明它是如何工作的,那就太好了。
catches :: IO a -> [Handler a] -> IO a
catches io handlers = io `catch` catchesHandler handlers
catchesHandler :: [Handler a] -> SomeException -> IO a
catchesHandler handlers e = foldr tryHandler (throw e) handlers
where tryHandler (Handler handler) res
= case fromException e of
Just e' -> handler e'
Nothing -> res
最佳答案
这是Scoped Type Variables GHC 扩展正在工作。点击链接了解更多信息。
基本上,您定义一个关于类型的断言,模式必须满足该类型才能匹配。所以,是的,它类似于守卫,但并不完全如此。
这个特定的例子是如何工作的?深入了解sources of "base" library找出:
class (Show e) => Exception e where
toException :: e -> SomeException
fromException :: SomeException -> Maybe e
data SomeException = forall e . Exception e => SomeException e
instance Exception IOException where
toException = IOException
fromException (IOException e) = Just e
fromException _ = Nothing
instance Exception ArithException where
toException = ArithException
fromException (ArithException e) = Just e
fromException _ = Nothing
我们看到IOException
和ArithException
是实现类型类Exception
的不同类型。我们还看到 toException/fromException
是一种包装/展开机制,允许将 Exception
类型的值转换为 IOException
类型的值。 、ArithException
等
所以,我们可以这样写:
f = expr `catches` [Handler handleArith,
Handler handleIO]
handleArith :: ArithException -> IO ()
handleArith ex = ....
handleIO :: IOException -> IO ()
handleIO ex = ....
假设发生IOException
。当catchesHandler
处理处理程序列表的第一个元素时,它会调用tryHandler
,后者又调用fromException
。从 tryHandler
的定义可以看出,fromException
的返回类型应该与 handleArith
的参数相同。另一方面,e
是 Exception 类型,即 - (IOException ...)。因此,类型以这种方式发挥作用(这不是有效的 haskell,但我希望您明白我的意思):
fromException :: (IOException ...) -> Maybe ArithException
从实例 Exception IOException ...
中,结果立即为 Nothing
,因此跳过此处理程序。出于同样的原因,将调用以下处理程序,因为 fromException
将返回 (Just (IOException ...))
。
因此,您使用了 handleArith
和 handleIO
的类型签名来指定何时调用它们中的每一个,以及 fromException/toException
确保事情以这种方式发生。
如果愿意,您还可以使用范围类型变量在 f
的定义中约束 handleIO
和 handleArith
的类型。可以说,这可以为您提供更好的可读性。
最终确定的作用域类型变量并不是这里的主要参与者。它们只是为了方便而使用。玩这种技巧的主要机制是 fromException/toException
和 friend 。作用域类型变量只是允许您拥有更类似于保护模式的语法。
关于haskell - Haskell 中可以定义自定义防护机制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2270699/
我的印象是 header guards 解决了重新定义的问题。我收到链接器错误,指出 .obj 文件中存在重新定义。这是我包含的 header ,问题在于所有全局声明的重新定义。 #ifndef DI
我正在 Microsoft Azure 中运行企业级应用程序。我想知道 Microsoft Azure 中 DDOS 投影的建议是什么。该文档明确指出该平台受到 DDOS 保护,但没有提供更多详细信息
我正在用 laravel sanctum 进行测试,但这里有一些问题.. 我正在创建管理员守卫。 当我将中间件更改为 auth:sanctum_admin .. 它应该只能由管理员访问,但在这里我可以
我有一个带有延迟加载模块的 Angular 4.3.6 应用程序。这是部分根路由器: const routes: Routes = [ { path: '', redirectTo: 'fleet
我有 Vaadin UI 的后端。我想保护后端数据库免受XSS攻击。对于 Vaadin UI 的 XSS 防护,您有何建议? 最佳答案 Vaadin 内置了 XSS 保护。所有组件都正确转义/编码 h
我正在尝试提高我的应用程序的安全性。每当我从用户(无论是通过 POST 还是 GET)接收到应该是整数的数据时,我都会适本地对其进行验证。但通常数据是 VARCHAR,有时可以包含 HTML。 在这种
我有一个具有此功能的服务,它会在 token 有效或无效时返回 true 或 false loggedIn() { return this.http.get('http://localhost:300
我们的应用程序中有几条路线,用户不应通过直接在浏览器的地址栏中输入网址来导航这些路线。 相反,当我们使用 router.navigate() 通过我们的应用程序逻辑以编程方式导航时,我们只想让它们可访
我通常在 .NET 中编写我的 SQL sql.Append("SELECT id, code, email FROM mytable WHERE variable = @variable "); 然
我需要同时将多行(1000 行)插入到 SQL Server 数据库中。我认为最好的方法是使用 SqlBulkCopy 但我不确定如何参数化插入查询以防止 SQL 注入(inject)。 你能帮我一下
Laravel 5.7 PHP 7.2.10 目前我可以使用 Web 和 api 防护中的任何一个,是否有任何方法可以同时允许两者,以便 Web 应用程序和 api 能够协同工作。 类似的东西 ret
Guard 总是因为这个问题而困扰我: .../gems/bundler-1.6.2/lib/bundler/runtime.rb:34:in `block in setup': You have a
我正在尝试通过 gmail api 从 Google 获取邮件 在收到 token 后对 Google_Client 进行身份验证时出现此错误 fatal error :未捕获异常“Google_Au
我是一名优秀的程序员,十分优秀!