在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 次 |
| 最近记录: |