gpt4 book ai didi

Haskell IO 函数 -> 类型匹配错误

转载 作者:行者123 更新时间:2023-12-01 11:02:53 26 4
gpt4 key购买 nike

我正在开发一个函数,该函数读取“a 2”形式的用户输入,然后将其转换为元组并将其添加到元组列表中。这应该会一直发生,直到用户输入“完成”为止。

代码如下...

getVectorData vector1 =  do
putStrLn "Enter dimension and coefficient separated by a space: Enter \"Done\" to move on to next vector: "
appData <- getLine

if appData == "done" then
putStrLn "That's it"
else do
createVectorTuple (words appData) : vector1
getVectorData vector1

createVectorTuple :: [String] -> (String, Float)
createVectorTuple vectorData = ((head vectorData) , (read (last vectorData) :: Float))

然而,当我试图执行这个文件时,我得到了错误

> ERROR file:.\MainApp.hs:13 - Type error in final generator
*** Term : getVectorData vector1
*** Type : IO ()
*** Does not match : [a]

我做错了什么?

最佳答案

您正在将 IO 与纯非 IO 函数混合。

getVectorData vector1 =  do
putStrLn "Enter dimension and coefficient separated by a space: Enter \"Done\" to move on to next vector: "
appData <- getLine

if appData == "done" then
putStrLn "That's it"

以上都是IO

    else do
createVectorTuple (words appData) : vector1

createVectorTuple 是一个非IO 函数。由于前面的部分是一个IO do-block,只有IO a 类型的表达式可以出现在那个do-block 中。但是,您会得到一些奇怪的错误消息,因为函数应用程序的优先级最高,所以上面的行被解析

(createVectorTuple (words appData)) : vector1

这是 [(String, Float)] 类型的表达式(如果 vector1 具有该类型)。现在 [] 也是一个 monad,所以 [a] 类型的表达式可以出现在 do block 中,但是该 block 中的所有表达式都必须具有列表类型。但是

        getVectorData vector1

是一个 IO () 类型的表达式,已从上面的部分确定。因此类型不匹配。诚然,报告的类型错误在那种情况下并不是最清楚的。

你可能想要类似的东西

let vector2 = createVectorTuple (words appData) : vector1
getVectorData vector2

或者完全不同的东西,我无法从简短的片段中分辨出来。

关于Haskell IO 函数 -> 类型匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9007804/

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