5

我目前正在尝试为原始算术函数编写一个小 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"

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

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

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

    Syntax error in instance head (variable expected)

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

4

3 回答 3

6

不要使用 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 #-}

于 2012-05-11T12:40:43.153 回答
3

(这不是答案(唐的报道),但评论太长了)

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

showOp op = case op 3 3 of
              6 -> "plus"
              0 -> "minus"
              9 -> "times"
              1 -> "divide"
              _ -> "undefined"
于 2012-05-11T13:00:33.920 回答
1

你也可以使用拥抱。

hugs -98 +o使用or启动 Hugsrunhugs -X-98 +o{-# LANGUAGE FlexibleInstances #-}在源文件中使用。

于 2012-05-12T08:05:42.273 回答