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

问题描述

考虑数字文字 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