グローバルに持つことはできませんが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