次のコードを検討してください。
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)
返すことができますか? これは単なる推測です..