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' 的输出还取决于我从用户那里获得的第二个字符,但我不知道如何将它传递给它。我不能将它作为参数传递,因为 func 是由第三方实现的,我无法更改类型。因此,如果 haskell 具有全局变量并且y是其中之一,那么func's 的实现将如下所示:

func char 
       |isDigit char = digitToInt char + digitToInt y
       |otherwise    = digitToInt y

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

4

2 回答 2

5

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

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

你最终会得到

doThingsWithGraph (x, makeFunc y)

当这变得繁重时,Reader Monad 可以提供帮助。

于 2013-10-26T19:22:33.697 回答
1

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

如果是这样,是否

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

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

于 2013-10-26T19:31:23.673 回答