4

对于家庭作业,子任务是使算术函数(+)(-)(*)div显示。

我们已经解决了剩下的任务,但我们被困在这里。现在我们在这里使用这个问题的解决方案来区分操作:

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

然而,这让我觉得像showOp (\a b -> a * 3 - y)yield这样的东西一样丑陋"plus"

有没有办法更好地区分运营商?

我们正在使用带有适当开关的 winhugs atm,-98 +o以便能够使用所需的扩展。

编辑: 根据要求,实际分配与数组有关(特别是Array Int (Int -> Int -> Int))。它与生成满足特定条件的运算符数组有关。

任务规定:

将数据类型设为 的Array Int (Int->Int-Int)实例Show。前面练习中的算术运算应该表示为“加号”、“减号”、“次”和“格”。

感谢您提前提供任何帮助

4

1 回答 1

2

使用感应:)

{-# LANGUAGE FlexibleInstances #-}

instance Eq (Int-> Int -> Int) where 
  f == g = induce f g where
    base = 1
    n = 2
    induce f g = and [f 1 n' == g 1 n' | n' <- [base, n, n+1]]

instance Show (Int-> Int -> Int) where 
  show a = showOp a where
    showOp op = case lookup op ops of
                  Just a -> a
                  otherwise  -> "undefined"
    ops = [((+),"plus")
          ,((-),"minus")
          ,((*),"times")
          ,(div,"divide")]

输出:

*Main> (\a b -> a * 3 - b) :: (Int->Int->Int)
undefined
于 2013-05-04T14:06:58.233 回答