Haskell中元组内部函数出错

时间:2011-02-17 20:32:01

标签: haskell functional-programming

我正在使用Haskell玩一点,我使用snd函数和一个元组(字符串,列表)时遇到了这个错误。

snd ("Felix Felices",[("Escarabajos Machacados",52,[f1,f2]),("Ojo de Tigre Sucio",2,[f2])])
ERROR - Cannot find "show" function for:
*** Expression : snd ("Felix Felices",[("Escarabajos Machacados",52,[f1,f2]),("Ojo de Tigre Sucio",2,[f2])])
*** Of type    : [([Char],Integer,[(Integer,Integer,Integer) -> (Integer,Integer,Integer)])]

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

4 个答案:

答案 0 :(得分:5)

可以将函数放入元组中。但是您无法显示它们 - ghci希望show结果并打印出来。它应该如何show(转换为字符串)函数?它不能,或者至少没有人感觉选择这样做的方式(无论如何都可能存在缺陷 - 至少我不会想到任何没有漏洞的方法,即使我可以看到它们)。因此,您无法在ghci中评估返回函数或函数集合的内容。

答案 1 :(得分:4)

问题实际上不是函数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"])]

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

答案 2 :(得分:3)

module Text.Show.Functions提供了instance Show (a -> b)

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

实际确定函数是什么并没有用,但无论如何都没有好办法(好的,调试器和vacuum除外)。但是,如果您只是想要一些Show实例,那么在标准库中是

答案 3 :(得分:0)

您无法在Haskell中打印裸函数,因为没有为它们定义“show”函数。 如果键入

,则会出现相同类型的错误

拥抱&GT; SQRT

例如

系统告诉表达式的类型,在你的情况下是([Char],Integer,[(整数,整数,整数) - >(整数,整数,整数)])],但不能打印它,因为它是一种功能。