如何修复 Haskell 中的“无法将预期类型 IO a0 与 int 匹配”?

How to fix ''couldn't match expected type IO a0 with int'' in Haskell?

checkArgCount args 行给我带来了麻烦。 args 是一个类型 [String] 不是吗?我很困惑为什么它会给我错误。

import System.IO
import Data.List
import System.Environment --for command line args

--Checks if number of arguments provided is 2
checkArgCount ::[String] -> Int
checkArgCount a = if (length a) == 2 then 2 else error "No arguments" 

main :: IO()
main = do
     args <- getArgs
     checkArgCount args

main 声明为 IO () 类型(正确)。任何函数中的最后一个表达式都是 return 值。此特定代码 return 是 checkArgCount args 的结果,即 Int

Int 值不是 IO () 值,因此不会进行类型检查。

您应该将 checkArgCount 的类型更改为 return ()IO (),或者向 main 添加更多使用 Int return编辑者 checkArgCount.

是,args :: [String],但 checkArgCount args 必须具有类型 IO (),作为 do 块中的最后一行,整体类型为 IO ()

所以这是关于输出类型,而不是该函数的输入类型。

if 的结果中将 2 更改为 print 2 应该可以修复它(当然还要更改 checkArgCount 的类型签名以适应更改)。

args <- getArgs
     if (length args) /= 2
        then return()
        else do -- ..continue coding

事实证明解决方案要简单得多