考虑以下代码:
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
's output also depends on the second char I am getting from the user, but I have no idea how to pass it on to it. I can' t将它作为参数传递,因为func是由第三方实现的,我无法更改类型 . 所以如果haskell有全局变量并且 y
是一个 func
的实现看起来像这样:
func char
|isDigit char = digitToInt char + digitToInt y
|otherwise = digitToInt y
这显然不起作用,因为 func
不知道 y
是什么,但这就是它应该做什么的想法 . 所以 y
是我需要以某种方式让 func
知道的值(这是我在 main
的第二行中从用户那里获得的值) . 我无法在 func
内做 getLine
,因为它赢得了't be consistent with data type which I can' t改变(大框架的一部分) . 有任何想法吗?也许一些辅助函数可以替换 let graph = (x, func)
中的 func
然后返回函数类型的函数?这只是猜测..
2 回答
我不太确定你的意思是“
func
是由第三方实施的". Do you mean "我希望第三方能够以允许我这样使用它们的方式实现这样的func
”?如果是的话,那样做
做这个工作?我认为这也是J. Abrahamson的建议 .
生成
func
的用户可以简单地实现像Char -> Function
这样的函数,而不是原始的Function
,并承诺你将从输入中作为第一个参数给它们第二个字符 .实际上,在没有全局变量的语言中,这是非常自然的事情:您必须在函数输入中声明所需的所有信息 . 其他任何东西都行不通 .
你最终会得到
如果这很麻烦,Reader Monad可以提供帮助 .