Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中元组内的函数出错_Haskell_Functional Programming - Fatal编程技术网

Haskell中元组内的函数出错

Haskell中元组内的函数出错,haskell,functional-programming,Haskell,Functional Programming,我正在和Haskell玩一些游戏,我被这个错误所困扰,使用带有元组(字符串、列表)的snd函数 问题是,如果我删除f1、f2和f3(它们是函数),代码工作正常,它会返回列表。为什么会发生这种情况,为什么我不能将函数放在元组的第二个位置?可以将函数放在元组中。但是您不能显示它们-ghci希望显示结果并打印它。它应该如何显示(转换为字符串)函数?这是不可能的,或者至少没有人愿意选择一种方法(不管怎样,这很可能是有缺陷的——至少我想不出任何一种方法,即使我能看到它们,也不会有巨大的漏洞)。因此,您无法

我正在和Haskell玩一些游戏,我被这个错误所困扰,使用带有元组(字符串、列表)的snd函数


问题是,如果我删除f1、f2和f3(它们是函数),代码工作正常,它会返回列表。为什么会发生这种情况,为什么我不能将函数放在元组的第二个位置?

可以将函数放在元组中。但是您不能显示它们-
ghci
希望
显示结果并打印它。它应该如何
显示
(转换为字符串)函数?这是不可能的,或者至少没有人愿意选择一种方法(不管怎样,这很可能是有缺陷的——至少我想不出任何一种方法,即使我能看到它们,也不会有巨大的漏洞)。因此,您无法评估在
ghci

中返回函数或函数集合的内容。问题不是真正的函数f1、f2或f3,问题是您正在尝试打印这些函数,但函数没有Show实例,因此无法打印它们。但是,如果您尝试:

Prelude> snd ("Felix Felices",[("Escarabajos Machacados",52,["f1","f2"]),("Ojo de Tigre     Sucio",2,["f2"])])
你得到的结果是:

[("Escarabajos Machacados",52,["f1","f2"]),("Ojo de Tigre Sucio",2,["f2"])]

所以问题不在于元组中不能有函数,问题在于不能将函数转换为字符串以便打印。

不能在Haskell中打印裸函数,因为没有为它们定义“show”函数。 如果键入,则会得到相同类型的错误

拥抱>sqrt

比如说


系统会告诉您表达式的类型,在您的例子中是([Char],Integer,[(Integer,Integer,Integer)->(Integer,Integer,Integer)]),但无法打印它,因为它是一个函数。

模块文本.Show.Functions
提供了一个
实例Show(a->b)

ghci>:m+Text.Show.Functions
ghci>[(*),(/)]
[,]

这对于真正弄清楚函数是什么并没有用处,但无论如何也没有好的方法(调试器和其他工具)。但是,如果您只是为了方便而想要一些
显示
实例,这是标准库中提供的。

谢谢您提供的所有答案!那么,有没有可能在f1、f2和f3中定义(我想说的是覆盖…)Show函数来显示它们的名称呢?没有,因为Haskell不是这样工作的。Haskell使用表达式,表达式的计算结果为值。“Show”是一个类型类,与Java类不同。有关更多详细信息,请参见此处:
[("Escarabajos Machacados",52,["f1","f2"]),("Ojo de Tigre Sucio",2,["f2"])]
ghci> :m +Text.Show.Functions
ghci> [(*), (/)]
[<function>,<function>]