考虑以下几点:在没有专门使用构造函数的情况下获取GADT风格声明中的约束?
{-# LANGUAGE GADTs, GADTSyntax #-}
data Test a where
Test :: Ord a => { first :: a, second :: a } -> Test a
comp :: Test a -> Bool
comp (Test fst snd) = fst < snd
构造Test
与一个Ord
约束声明。在comp
,我已经明确采取Test
构建的参数,这给Ord
约束允许我使用<
现在,假设我想写:
comp' :: Test a -> Bool
comp' x = (first x) < (second x)
使用投影功能,以获得第一和第二元素。这是而不是没问题,因为我的参数x
不是(必然)用Test
构建的,所以没有Ord
约束。
所以,我的问题,是有办法把参数作为刚刚x
但仍不知为什么从Test
构造的Ord
约束,而不必“解压”或在Test
构造模式匹配或添加约束我的功能?
至于为什么我想这一点,我有一个构造数据类型采取了许多价值观,其中之一,我只需要在这个特殊的功能,所以拆包它使我的功能不必要的冗长:
myFunction :: Thing -> ...
myFunction (Thing _ _ _ _ need _ _) ...
与之相对
myFunction t = ... (need t)
您可以使用'myFunction t @ Thing {} = ...'。 – Alec
'myfunction Thing {need = x}'这提供了'Ord'字典,而且'need'字段的值也已经解压到'x'中。还有一个扩展可以让你编写'myFunction Thing {need}',并且在主体中你可以使用'need'这个名字来引用参数'need'字段的值。 – Bakuriu
谢谢你们,不知道那种语法! – cemulate