Haskell 纯代码和非纯代码?I/O数据类型相关 name
这段话暗示了这样一个事实,即如果函数中没有Haskell 纯代码和非纯代码?I/O数据类型相关 name,haskell,functional-programming,Haskell,Functional Programming,这段话暗示了这样一个事实,即如果函数中没有IO单子,则不能在具有“纯”类型的函数中使用getLine。例如,如果我们试图逃跑 name <- getLine 编译器会抱怨,因为length需要String(或任何其他列表类型),而getLine是IO字符串。因此存在类型不匹配 但这并不意味着不能组合length和getLine:下面是如何组合的 lineLength :: Int -> Int lineLength n = n + length getLine lineLengt
IO
单子,则不能在具有“纯”类型的函数中使用getLine
。例如,如果我们试图逃跑
name <- getLine
编译器会抱怨,因为length
需要String
(或任何其他列表类型),而getLine
是IO字符串
。因此存在类型不匹配
但这并不意味着不能组合length
和getLine
:下面是如何组合的
lineLength :: Int -> Int
lineLength n = n + length getLine
lineLength::Int->IO Int
线宽n=do
第Int行
,编译器证明函数是纯函数这一事实可以信赖:对于相同的输入,它将返回相同的结果。(有一些低级的方法可以避免这种情况,但它们不适用于常规代码。)这个问题太广泛了。你可以尝试另一个教程或哈斯克尔的书,以一种对你更有意义的方式解释IO
。对于@jberryman建议的问题,公认的答案比你引用的关于污点的解释更好。除此之外,我们还可以补充一点,当您使用name时,我会比其他人更直截了当。你引用的段落不是思考IO
的好方法。(您如何理解此模型中的[IO a]
或IO a->IO b
或IO(IO a)
)您应该找到对IO
类型构造函数含义的不同解释。
lineLength :: Int -> IO Int
lineLength n = do
line <- getLine
return (n + length line)