问题描述
考虑数字文字 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"
该模式仅在同时具有 Read
和 Show
类时才有效,无论它位于等号的哪一侧。有没有办法让它在等号的左侧输入 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