模式同义词能否在每个方向上具有不同的类型签名,就像数字文字那样?
Can a pattern synonym have a different type signature in each direction, like numeric literals do?
考虑数字文字 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
考虑数字文字 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