如何解决这些Haskell Kind错误

Mik*_*ike 4 haskell types

所以我一直在搞乱Haskell,我在代码中遇到了这个奇怪的错误.

"'IO'不适用于足够的类型参数
预期种类'?',但'IO'有种' - > '
在'loop'的类型签名中:loop :: State - > IO"

这是守则

import System.IO
data State = State [Int] Int Int deriving (Show)

main = do
   loop (State [] 0 0)

loop::State -> IO
loop state = do
   putStr "file: "
   f <- getLine
   handle <- openFile f ReadMode
   cde <- hGetContents handle
   hClose handle
   putStrLn cde
   loop state
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?此外,任何有关种类的见解将不胜感激.

Fre*_*Foo 11

IO是一个类型构造函数,而不是完整类型.你应该申报

loop :: State -> IO ()
Run Code Online (Sandbox Code Playgroud)

其中()单元类型 ; 只有一个值的类型,也拼写().这是永久循环或任何其他不返回(有意义)值的函数的适当类型.


luq*_*qui 11

IO是一个类型构造函数,这意味着它需要一个参数才能成为一个类型.所以:

IO Int
IO String
IO ()
Run Code Online (Sandbox Code Playgroud)

是类型,但IO本身不是.

样的IO就是* -> *,这好像是说这是一个函数,需要一个类型并返回一个类型.

我建议改变

loop :: State -> IO
Run Code Online (Sandbox Code Playgroud)

loop :: State -> IO ()
Run Code Online (Sandbox Code Playgroud)

(()是"单元类型",它只有一个值(也称为()),通常用于voidC语言中使用的位置)