接受两个参数的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