Haskell类型使用$ operator时表达式出错

ct2axkht  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(129)

我一直在阅读Christopher艾伦和Julie Moronuki的“Haskell Programming from first principles”,我被困在第55页的一个代码示例上,它似乎不起作用。
该示例用于说明在GHCI中运行以下表达式时如何使用$运算符:

(2^) $ (*30) $ 2 + 2

字符串
这将导致引发以下错误

<interactive>:146:1: error:
• Could not deduce (Num t10)
  from the context: (Num a, Num t1, Num (t1 -> a))
    bound by the inferred type for ‘it’:
               forall {a} {t1}. (Num a, Num t1, Num (t1 -> a)) => a
    at <interactive>:146:1-20
  The type variable ‘t10’ is ambiguous
  Potentially matching instances:
    instance Num Integer -- Defined in ‘GHC.Num’
    instance Num Double -- Defined in ‘GHC.Float’
    ...plus three others
    ...plus two instances involving out-of-scope types
    (use -fprint-potential-instances to see them all)
• In the ambiguity check for the inferred type for ‘it’
  To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
  When checking the inferred type
    it :: forall {a} {t1}. (Num a, Num t1, Num (t1 -> a)) => a


我在输入表达式时是否犯了某种错误?这在Haskell中应该是一个有效的表达式吗?给出的错误实际上意味着什么?
编辑:我重新启动了GHCI,上面的表达式现在没有错误,给出了预期的值。现在我无法重现错误。
编辑2:我想知道我是否在GHCI会议的早些时候意外地重新定义了一些东西。从书中阅读,我想我可能错误地输入了以下内容(看起来像是一个代码示例):

f $ a = f a


现在我能够重现上面的问题。仍然不知道发生了什么。

r6vfmomb

r6vfmomb1#

GHCi, version 9.8.1: https://www.haskell.org/ghc/  :? for help
ghci> :info $
($) :: (a -> b) -> a -> b       -- Defined in ‘GHC.Base’
infixr 0 $
ghci> f $ a = f a
ghci> :info $
($) :: (t1 -> t2) -> t1 -> t2   -- Defined at <interactive>:2:3
infixl 9 $
ghci>

字符串
从上面可以看出,GHC.Base定义的$的固定性是infixr 0,而你的固定性是infixl 9(默认值,因为您没有指定)。结果,表达式(2^) $ (*30) $ 2 + 2被解析为(((2^) $ (*30)) $ 2) + 2,这意味着无意义的(2^) (*30) 2 + 2,而它应该被解析为(2^) $ ((*30) $ (2 + 2)),也就是正确的(2^) ((*30) (2 + 2))

相关问题