所以我一直在搞乱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语言中使用的位置)