DuplicateRecordFields和Function Composition

时间:2018-02-15 18:22:41

标签: haskell

根据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
-}

为什么在使用带有记录字段的函数时会中断?我认为它仍然会被函数类型消除歧义。

1 个答案:

答案 0 :(得分:3)

不幸的是,我认为扩展太脆弱了。

来自文档:

  

但是,我们不推断参数的类型来确定数据类型,或者有任何方法可以将选择推迟到约束求解器。

f = not . x中,必须推断出x的参数类型,利用(.)f的类型(已提供)。

消除歧义很麻烦。一个人必须写

f = not . (x :: A -> Bool)

或者,PartialTypeSignatures开启,(&沉默警告)

f = not . (x :: A -> _)

两者都不方便。