【问题标题】:Instance Show for function功能实例展示
【发布时间】:2012-05-11 12:18:57
【问题描述】:

我目前正在尝试为原始算术函数编写一个小的 Show 实例。

目标是制作可显示的函数列表。

非常简单的 show 函数如下所示:

  showOp :: (Int -> Int -> Int) -> String
  showOp op
    | op 3 3 == 6 = "plus"
    | op 3 3 == 0 = "minus"
    | op 3 3 == 9 = "times"
    | op 3 3 == 1 = "divide"
    | otherwise = "undefined"

但我无法获得 Show for (Int -> Int -> Int) 的实例。我是这样试的:

    instance Show (Int -> Int -> Int) where
    show op = show "asdf"

但它不起作用。 WinHugs 只是返回错误

    Syntax error in instance head (variable expected)

甚至可以为函数定义 Show 吗?如果是,我该如何解决这个问题?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    不要使用 WinHugs。使用 GHC。

    事实上,在最近的 Haskell 平台版本中,已经有一个 Show 函数的实例。

    Prelude Text.Show.Functions> show (+1)
    "<function>"
    Prelude Text.Show.Functions> show (\x -> x ++ "foo")
    "<function>"
    

    现在,在您的情况下,您需要打开 -XFlexibleInstances,因为您的实例不是 (Constructor a1 .. an) 的形式,其中 a1 .. an 是不同的类型变量。

    {-# LANGUAGE FlexibleInstances #-}打开它

    【讨论】:

    • 也就是说,无法定义Show 来实际为您提供有关该功能的更多详细信息。
    • 当然可以。它可以显示类型(通过 Typeable 给出);或者它可以显示一些输入和输出(就像在 QuickCheck 中所做的那样)。
    • ...是的。好的。对不起。但是,它不能显示实现或名称。
    【解决方案2】:

    (这不是一个答案(Don's涵盖了它),但评论太长了)

    代码有很多重复的逻辑(特别是op 3 3 == 出现了很多),但要使这个更清晰:case expressions。这允许我们计算一次op 3 3,然后处理各种情况(与函数定义中的模式匹配完全相同)。

    showOp op = case op 3 3 of
                  6 -> "plus"
                  0 -> "minus"
                  9 -> "times"
                  1 -> "divide"
                  _ -> "undefined"
    

    【讨论】:

      【解决方案3】:

      你也可以使用拥抱。

      hugs -98 +orunhugs -X-98 +o 开始Hugs,并在源文件中使用{-# LANGUAGE FlexibleInstances #-}

      【讨论】:

        猜你喜欢
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 2013-08-08
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        相关资源
        最近更新 更多