你不能assignWeight
全局拥有,但你可以在本地拥有你想要的真正的非 IO 类型。我认为下面的方法是用于将单子代码与非单子代码分开的常用模式。
import Data.Maybe
import Control.Applicative
parseFile :: IO [(String, Int)]
parseFile = read <$> readFile "Parse.txt"
main = do
content <- parseFile
let assignWeight x = fromJust $ lookup x content
print $ process assignWeight
type Weight = String -> Int
process :: Weight -> Int
process x = 0
这assignWeight
是正确的类型。你可以传递它:看看我是如何将它传递给非单子process
函数的。正如其他评论者指出的那样,您不能assignWeight
在不违反纯度的情况下在顶层进行定义,但是在本地进行定义并传递是一种常用的方法。
这是一种更模块化的方法:
getAssignWeight :: IO Weight
getAssignWeight = do
content <- parseFile
let assignWeight x = fromJust $ lookup x content
return assignWeight
main = do
assignWeight <- getAssignWeight
print $ process assignWeight