haskell函数取2个参数返回函数,它接受一个参数?

时间:2013-10-26 19:14:37

标签: haskell

考虑以下代码:

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有全局变量而yfunc的实现,那么func char |isDigit char = digitToInt char + digitToInt y |otherwise = digitToInt y 的实现将如下所示:

func

这显然不起作用,因为y不知道y是什么,但这就是它应该做什么的想法。所以func是我需要以某种方式让main知道的值(它是我在getLine的第二行中从用户那里获得的值)。我不能在func内做func,因为这与我无法改变的数据类型(大框架的一部分)不一致。有任何想法吗?也许一些辅助函数可以替换let graph = (x, func)中的{{1}}然后返回函数类型的函数?这只是猜测..

2 个答案:

答案 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的建议。