Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 纯代码和非纯代码?I/O数据类型相关 name_Haskell_Functional Programming - Fatal编程技术网

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)