我正在使用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(它们是函数)代码工作正常,它返回列表。为什么会发生这种情况,为什么我不能把一个函数放在元组的第二个位置?
答案 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,[(整数,整数,整数) - >(整数,整数,整数)])],但不能打印它,因为它是一种功能。