考虑以下代码:
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
的输出还取决于我从用户那里得到的第二个字符,但我不知道如何将它传递给它。我无法将其作为参数传递,因为func是由第三方实现的,我无法更改类型。因此,如果haskell有全局变量而y
是func
的实现,那么func char
|isDigit char = digitToInt char + digitToInt y
|otherwise = digitToInt y
的实现将如下所示:
func
这显然不起作用,因为y
不知道y
是什么,但这就是它应该做什么的想法。所以func
是我需要以某种方式让main
知道的值(它是我在getLine
的第二行中从用户那里获得的值)。我不能在func
内做func
,因为这与我无法改变的数据类型(大框架的一部分)不一致。有任何想法吗?也许一些辅助函数可以替换let graph = (x, func)
中的{{1}}然后返回函数类型的函数?这只是猜测..
答案 0 :(得分:5)
生成func
的用户可以简单地实现Char -> Function
之类的功能,并将其交给您而不是原始Function
,并承诺您将从输入中提供第二个字符。第一个论点。
实际上,在没有全局变量的语言中,这是非常自然的事情:您必须在函数输入中声明所需的所有信息。其他任何东西都行不通。
你最终会得到
doThingsWithGraph (x, makeFunc y)
当负担繁重时,读者Monad可以提供帮助。
答案 1 :(得分:1)
我不确定你的意思是“func
由第三方实施”。你的意思是“我希望第三方能够以允许我这样使用它们的方式实现这样的func
”吗?
如果是的话,
func :: Char -> Function
func y char
|isDigit char = digitToInt char + digitToInt y
|otherwise = digitToInt y
做这个工作?我认为这也是J. Abrahamson的建议。