我一直在阅读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
型
现在我能够重现上面的问题。仍然不知道发生了什么。
1条答案
按热度按时间r6vfmomb1#
字符串
从上面可以看出,
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))