gpt4 book ai didi

haskell - 我可以在派生的 Show 中制作 haskell GADT 数据构造函数中缀吗?

转载 作者:行者123 更新时间:2023-12-03 23:45:11 26 4
gpt4 key购买 nike

考虑两个 data声明:

{-# LANGUAGE GADTs #-}

data X = Int `Y` Int deriving Show

data Z where
W :: Int -> Int -> Z deriving Show

main = do
print (1 `Y` 2)
print (3 `W` 4)

运行上述程序会产生:
1 `Y` 2
W 3 4

所以导出 show知道 Y是中缀并相应地打印它。 ::语法似乎不允许中缀。

有什么方法可以让编译器为 W 派生显示吗?作为中缀,(除了为 show 明确提供 Z 实例)?
所需的输出是
1 `Y` 2
3 `W` 4

最佳答案

不是现在。 GADT 构造函数仅被标记为中缀 under a specific set of conditions :

Note [Infix GADT constructors]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We do not currently have syntax to declare an infix constructor in GADT syntax,
but it makes a (small) difference to the Show instance. So as a slightly
ad-hoc solution, we regard a GADT data constructor as infix if
a) it is an operator symbol
b) it has two arguments
c) there is a fixity declaration for it
For example:
infix 6 (:--:)
data T a where
(:--:) :: t1 -> t2 -> T Int


所以对于像 W 这样的非符号构造函数,看起来你运气不好,但如果你愿意让它具有象征意义,你可以添加一个固定性声明。

(帽子提示 this template haskell bug thread )

关于haskell - 我可以在派生的 Show 中制作 haskell GADT 数据构造函数中缀吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44729223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com