为什么签名在分配后会发生变化

vir*_*tor 7 haskell ghci

ghci我身边玩耍时得到以下表达式:unlines . map (\(a,b) -> show a ++ " " ++ show b)

现在,当我检查它时,:t我得到:

> :t  unlines . map (\(a,b) -> show a ++ " " ++ show b)
unlines . map (\(a,b) -> show a ++ " " ++ show b)
  :: (Show a, Show a1) => [(a, a1)] -> String
Run Code Online (Sandbox Code Playgroud)

完全如预期的那样.但现在,如果我尝试将其分配给某个名称,我会获得比原始名称更具体的签名:

> let f = unlines . map (\(a,b) -> show a ++ " " ++ show b)
> :t f
f :: [((), ())] -> String
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

ham*_*mar 12

由于单形态限制,形式x = ...(无参数)的定义被赋予单形(即非多态)类型,这通常涉及一些违约,如另一个答案中所述.

要防止这种情况发生,请在定义中添加类型签名,或者使用禁用单态限制:set -XNoMonomorphismRestriction.您可以将其添加到您的.ghci文件中,以使其在启动时自动运行,直到在某些未来版本中默认禁用GHCi.


归档时间:

查看次数:

122 次

最近记录:

12 年,11 月 前