次のコードを検討してください。
type Graph = (Char, Function)
type Function = Char -> Int
doThingsWithGraph :: Graph -> String
func :: Function
graph :: Graph
main = do x <- getChar
y <- getChar
let graph = (x, func)
putStrLn $ doThingsWithGraph graph
の実装はdoThingsWithGraph今のところ問題ありません。ここでの問題は、funcの出力がユーザーから取得した2番目の文字にも依存することですが、それを渡す方法がわかりません。funcはサードパーティで実装されており、型を変更できないため、引数として渡すことができません。したがって、 haskell にグローバル変数yがあり、その 1 つである場合、funcの実装は次のようになります。
func char
|isDigit char = digitToInt char + digitToInt y
|otherwise = digitToInt y
これは明らかに機能しません。なぜなら、それがfunc何でyあるかわからないからです。yなんらかの形で通知する必要がある値です(これfuncは、の 2 行目でユーザーから取得しているものですmain)。変更できないデータ型 (大規模なフレームワークの一部) と一致しないため、getLine内部で行うことはできません。func何か案は?たぶん、いくつかのヘルパー関数が関数型の関数を置き換えfuncてlet graph = (x, func)返すことができますか? これは単なる推測です..