微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模式同义词能否在每个方向都有不同的类型签名,就像数字文字那样?

如何解决模式同义词能否在每个方向都有不同的类型签名,就像数字文字那样?

考虑数字文字 1。它有不同的类型,具体取决于它是用在等号的左边还是右边。在 f True = 1 中,1 的类型为 Num p => p。但在 f 1 = True 中,1 的类型为 (Eq a,Num a) => a。是否可以创建一个以相同方式工作的模式同义词?例如:

pattern LooksLikeFoo :: (Read a,Show a) => a
pattern LooksLikeFoo <- (show -> "Foo")
  where LooksLikeFoo = read "Foo"

该模式仅在同时具有 ReadShow 类时才有效,无论它位于等号的哪一侧。有没有办法让它在等号的左侧输入 Show a => a,而在右侧输入 Read a => a?非工作伪代码

pattern LooksLikeFoo :: Show a => a
pattern LooksLikeFoo <- (show -> "Foo")
  where LooksLikeFoo :: Read a => a
        LooksLikeFoo = read "Foo"

解决方法

这目前是不可能的,但 Edward Kmett 已经多次提出这种可能性,例如:https://www.reddit.com/r/haskell/comments/eqhcgx/comment/fetsa54

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。