首页 文章

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

提问于
浏览
2

考虑以下代码:

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 回答

  • 5

    我不太确定你的意思是“ func 是由第三方实施的". Do you mean "我希望第三方能够以允许我这样使用它们的方式实现这样的 func ”?

    如果是的话,那样做

    func :: Char -> Function
    func y char 
           |isDigit char = digitToInt char + digitToInt y
           |otherwise    = digitToInt y
    

    做这个工作?我认为这也是J. Abrahamson的建议 .

  • 1

    生成 func 的用户可以简单地实现像 Char -> Function 这样的函数,而不是原始的 Function ,并承诺你将从输入中作为第一个参数给它们第二个字符 .

    实际上,在没有全局变量的语言中,这是非常自然的事情:您必须在函数输入中声明所需的所有信息 . 其他任何东西都行不通 .

    你最终会得到

    doThingsWithGraph (x, makeFunc y)
    

    如果这很麻烦,Reader Monad可以提供帮助 .

相关问题