我曾经认为在Haskell的类型系统中,纯函数无法调用不纯函数(例如 f :: a -> IO b
),但今天我意识到,通过使用return
调用它们,这样做是可以编译通过的。在这个例子中:
h :: Maybe ()
h = do
return $ putStrLn "???"
return ()
h
在 Maybe
函子中工作,但它仍然是一个纯函数。编译和运行它只会返回 Just ()
,就像人们所期望的那样,而不实际执行任何 I/O 操作。我认为 Haskell 的惰性将这些东西放在一起(即 putStrLn
的返回值未被使用 - 由于其值构造函数已隐藏且无法模式匹配,请问), 但为什么这段代码是合法的?是否有其他原因使其被允许?
额外问题:通常来说,在一个函子中禁止另一个函子执行操作是否可能,如何实现?
Control.Monad.ST.stToIO
可以将ST
计算转换为IO
计算。 - Louis Wassermanf :: (Int -> IO ()) -> Int
这样的函数会发生什么。 - funct7