2017-10-30 3 views
0

私はhaskellを初めて使い、オペランドを使用しようとしています。`max 'の使用に起因する(Ord a0)のインスタンスがありません

function strangeMathsは、3つの関数とオペランドを使用して、logBase 2((max x)^ 3)のようにsmthでなければなりません。 ので、私は、このコード

strangeMaths = f . g . h 

f = logBase 2 

g = (^3) 

h = max 

をしましたが、これは私にエラー与える:

No instance for (Ord a0) arising from a use of `max' 
    The type variable `a0' is ambiguous 
    Relevant bindings include 
     h :: a0 -> a0 -> a0 (bound at 14)doItYourSelf.hs:7:1) 
    Note: there are several potential instances: 
     instance Integral a => Ord (GHC.Real.Ratio a) 
     -- Defined in `GHC.Real' 
     instance Ord() -- Defined in `GHC.Classes' 
     instance (Ord a, Ord b) => Ord (a, b) -- Defined in `GHC.Classes' 
     ...plus 23 others 
    In the expression: max 
    In an equation for `h': h = max 
Failed, modules loaded: none. 

P.S.を私はそのlog(a、b^c)= c * log(a、b)を知っていますが、これは一例です。

+5

私はこれがあなたを噛んでいる独特の制限だと思います。 – melpomene

+3

「最大x」は何を意味しますか? 'max'は1つではなく2つの引数をとります。このコードは意味をなさない。 – AJFarmar

答えて

3

あなたの問題は、maxが1つではなく2つの引数を取ることです。

のは.の署名を検証してみましょう:

(.) :: (b -> c) -> (a -> b) -> (a -> c) 

我々は明らかに、これらはそれらを一緒に一つの引数を取り、「チェーン」の機能を取ることがわかります。

今度は、maxを見てみましょう:

max :: (Ord a) => a -> a -> a 

これは、2つの引数を取る関数である、または他の言葉で別の関数を返し、その後、一つの引数を取ります。したがって、例えば、max 1 :: Int -> Int

今度は、g . hであなたが書いしようとしている機能の一部を見てみましょう:

f . g 
= (^2) . max 
= \a -> (max a)^2 

その後、我々は問題がある:max aは機能ではなく、浮動小数点値です。したがって、コンパイラは不平を言う。これはmap^2またはreverse^2を計算するのと同じです。それは完全に無意味です。


残念ながら、あなたが実際に何をすべきかstrangeMaths述べていないので、私はあなたがそれを書くべきかを伝えることはできません。

  • 書き換えh(代わりmaxの)max 1として、またはいくつかの他の同様の値:しかし、問題を解決するために、いくつかの方法があります。
  • strangeMaths(.) (f . g) . hと書き換えます。
  • フォームa -> aの機能の場合はFloatingインスタンスを記述します。 (私はあなたがこれを行うだろうかか理由を知りませんが、それは可能です。)

私は、これは多くの理にかなっている、strangeMaths x y = logBase 2 ((max x y)^2)ことを意味するように、第2のケースは、真であると思われます。

関連する問題