gpt4 book ai didi

haskell - haskell 源文件中的一行与 GHCI 中的一行之间的差异

转载 作者:行者123 更新时间:2023-12-03 14:26:07 25 4
gpt4 key购买 nike

这里是 Haskell 新手,所以如果问题太简单,请原谅。只是我似乎无法理解为什么有些事情在文件中没问题,而在 GHCI 中却没有。例如,我在一个文件中有以下几行:

showLst :: [[Int]] -> IO ()
showLst = putStrLn . unlines . map show

这需要一个 m x n 数组并将结果打印在屏幕上。一个非常方便的功能。但是,当我对 GHCI 进行快速检查并且我想要相同的功能时,我尝试在 GHCI 中定义相同的函数,如下所示:
>> let showLst = putStrLn . unlines . map show
>> showLst [[1,2,3], [4,5,6], [7,8,9]]

我收到类型错误。所以我尝试了几种变体:
>> (showLst [[1,2,3], [4,5,6], [7,8,9]]) :: IO ()
>> (showLst:: [[Int]] -> IO ()) [[1,2,3], [4,5,6], [7,8,9]]
>> (showLst [[1,2,3], [4,5,6], [7,8,9]]) :: [[Int]] -> IO () -- which us wrong anyway
>> showLst [[1,2,3], [4,5,6], [7,8,9]] :: [[Int]] -> IO () -- which is also wrong

等等,他们都失败了。这似乎是一件非常简单的事情,但不知道为什么我觉得这很困难。我一定遗漏了一些非常重要的东西。有人可以让我知道我在做什么吗?

最佳答案

问题是由于monomorphism restriction GHCi 默认列表元素的类型为 () :

Prelude> let showLst = putStrLn . unlines . map show
Prelude> :t showLst
showLst :: [()] -> IO ()

您可以禁用此限制并获取常规类型:
Prelude> :set -XNoMonomorphismRestriction 
Prelude> let showLst = putStrLn . unlines . map show
Prelude> :t showLst
showLst :: Show a => [a] -> IO ()

或者您可以手动指定所需的类型:
Prelude> let showLst = putStrLn . unlines . map show :: [[Int]] -> IO ()

关于haskell - haskell 源文件中的一行与 GHCI 中的一行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com