【问题标题】:Error with functions inside tuples in HaskellHaskell 元组中的函数出错
【发布时间】:2011-02-19 17:27:24
【问题描述】:

我正在用 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(它们是函数),代码就可以正常工作,它会返回列表。为什么会这样,为什么我不能在元组的第二个位置放一个函数?

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    可以将函数放入元组中。但是你不能显示它们——ghci 想要show 结果并打印出来。它应该如何show(转换为字符串)函数?它不能,或者至少没有人愿意选择一种方法(无论如何这可能是有缺陷的——至少我想不出任何没有大洞的方法,即使我能看到它们)。因此,您无法评估返回 ghci 中的函数或函数集合的内容。

    【讨论】:

      【解决方案2】:

      问题不在于函数 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"])]
      

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

      【讨论】:

      • 感谢您的所有回答!那么,是否可以在 f1、f2 和 f3 中定义(我要说的是覆盖...) Show 函数以显示它们的名称?
      • 不,因为 Haskell 不能那样工作。 Haskell 使用表达式,这些表达式被评估为值。 “Show”是一个类型类,它与Java 类不同。更多详情请看这里:stackoverflow.com/questions/2685626/…
      【解决方案3】:

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

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

      它对于实际弄清楚函数是什么没有用,但无论如何也没有好方法(除了调试器和vacuum)。但是,如果您只是为了方便而想要一些 Show 实例,那么这个 在标准库中。

      【讨论】:

        【解决方案4】:

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

        拥抱>sqrt

        例如

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          相关资源
          最近更新 更多