根据DuplicateRecordFields“我们可以使用被推入到选择器出现的类型,或者在其参数上使用类型签名来确定意味着的数据类型”。
因此,以下工作 1 :
{-# LANGUAGE DuplicateRecordFields #-}
module Records where
data A = A { x :: Bool }
data B = B { x :: Int }
f :: A -> Bool
f = x
但这不是:
{-# LANGUAGE DuplicateRecordFields #-}
module Records where
data A = A { x :: Bool }
data B = B { x :: Int }
f :: A -> Bool
f = not . x
{-
duprecords.hs:9:11: error:
Ambiguous occurrence `x'
It could refer to either the field `x',
defined at duprecords.hs:6:14
or the field `x',
defined at duprecords.hs:5:14
-}
为什么在使用带有记录字段的函数时会中断?我认为它仍然会被函数类型消除歧义。
答案 0 :(得分:3)
不幸的是,我认为扩展太脆弱了。
来自文档:
但是,我们不推断参数的类型来确定数据类型,或者有任何方法可以将选择推迟到约束求解器。
在f = not . x
中,必须推断出x
的参数类型,利用(.)
和f
的类型(已提供)。
f = not . (x :: A -> Bool)
或者,PartialTypeSignatures
开启,(&沉默警告)
f = not . (x :: A -> _)
两者都不方便。