2013-05-03 94 views
4

的基本算术函数用于作业分配,子任务是使算术函数(+),(-),(*)div可显示。显示作为字符串

我们解决了剩余的任务,但是我们被困在这里。现在我们正在使用the solution to this question here操作来区分:

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

然而,这给我的印象样的丑陋的东西像showOp (\a b -> a * 3 - y)产量"plus"

有什么办法可以更好地区分操作员吗?

我们使用winhugs atm和相应的开关-98 +o以便能够使用所需的扩展。

编辑: 按照要求,实际分配与阵列(特别是Array Int (Int -> Int -> Int))做。它与生成满足特定条件的操作符数组有关。

的分配状态:

使数据类型Array Int (Int->Int-Int)Show一个实例。前面练习中的算术运算应表示为“加号”,“减号”,“时间”和“div”。

提前THX任何帮助

+0

我会很高兴地看到从分配一些情况下,因为制作功能本身显得似乎是作业的一个奇怪的要求。 – shang 2013-05-03 09:13:05

+1

如果明确要求Int-> Int-> Int',那么比起这样一个启发式的不安全案例表,你能做的事情要好得多。 (如果一般的'(数字a)=> a-> a-> a'被允许的话,这将有可能使[更好](https://github.com/leftaroundabout/Symbolic-math-HaTeX)。 ) – leftaroundabout 2013-05-03 09:34:03

+0

我认为这是一样好,你会看到 - 我认为这是绝对[不可能](http://stackoverflow.com/questions/4328620/comparing-functions-in-haskell)检查平等功能,这意味着您需要检查操作等同性。您可以扩展测试范围以捕获更多未定义的函数,但不多。 – isturdy 2013-05-03 15:35:47

回答

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 
+0

'all(== True)'最好表示为'all id' – is7s 2013-05-18 21:19:13

+0

@ is7s真棒!感谢提示 – 2013-05-18 23:04:15

+2

@ is7s:或者更好,['和'](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:and)。 – hammar 2013-05-18 23:07:52