接受两个参数的haskell函数返回接受一个参数的函数?

接受两个参数的haskell函数返回接受一个参数的函数?,haskell,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) putStrL

考虑以下代码:

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

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

您生成
func
的用户可以简单地实现类似
Char->function
的函数,并将其交给您,而不是原始的
函数
,并承诺您将给他们输入的第二个Char作为第一个参数

事实上,在没有全局变量的语言中,这是非常自然的事情:必须在函数输入中声明所需的所有信息。别的什么都不行

你最终会得到

doThingsWithGraph (x, makeFunc y)

当这变得很麻烦时,阅读器Monad可以提供帮助。

我不太清楚您所说的“
func
由第三方实现”是什么意思。您的意思是“我希望第三方能够以允许我这样使用它们的方式实现这样的
func
s”

如果是,是吗

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

做这个工作?我想这也是J.Abrahamson的建议。

我不太清楚你所说的“
func
由第三方实现”是什么意思。你的意思是“我希望第三方能够实现这样的
func
s”?对不起,我的意思是“图形”已经在我正在使用的框架中实现,并且需要一个function类型的函数作为第二个参数。你是说我可以创建一个接受一个参数并返回接受其他参数的函数?如果是这样的话,那就是我需要的。我以前从来没有写过返回函数的函数。你有没有关于如何实现这一点的进一步建议?谢谢没错
makeFunc
将是
Char->Char->Int
类型,这意味着您可以传递两个
Char
参数并获得一个
Int
,或者只传递一个参数并获得一个
Char->Int
函数。不需要额外的步骤。@user2922609完全正确!在哈斯克尔,这是一个非常普遍的模式。毫无疑问,一开始很奇怪,但您可以看到所有多参数函数“一次应用一个参数”。例如,如果我们有
addxy=x+y
那么
add::Int->Int->Int
add2::Int->Int
都是完全有效的函数。此属性称为“部分应用程序”。另请参阅,其中详细说明了“函数返回函数”的技术。
func :: Char -> Function
func y char 
       |isDigit char = digitToInt char + digitToInt y
       |otherwise    = digitToInt y