2016-12-23 4 views
1

.演算子を使用して、3つの値をとり最大値を返す関数を作成しようとしています。最大で連鎖する。演算子

明らか

、以下の作業

max3 a b c = max a (max b c) 
max3 a b c = max a $ max b c 

が、私は.を使用したいと思います。私は例が愚かであることを知っているが、正しいこのを行う方法と、なぜをいただければ幸いの素敵な説明

max3 a b c = max a . max b c 

を試みたが、

Couldn't match expected type `a0 -> Float' with actual type `Float' 
In the first argument of `max', namely `b' 

エラーが発生します。

+0

一つは ''ではないことを覚えておく必要があります書くことができます

max3 a b c = max a ((max b) c) = (max a . max b) c 

注意をいくつかの組み込みのマジック演算子;他の関数と同様に定義された通常の関数です。 – AJFarmar

+0

@AJFarmar問題は(私が尋ねる時に気づいていなかったが)主にエラーメッセージが役に立たなかったということでした。私はまだmaxが 'a0 - > Float'を期待すべき理由を理解していません。 – Kittsil

答えて

6

リコール(.)の定義:

(f . g) x = f (g x) 

あなたは私たちがf = max ag = max b、およびx = cを設定した場合(f . g) xの右辺と一致する式

max a (max b c) 

を持っています。 (.)の定義の左側にこれらの置換を使用して、我々が得る:

(max a . max b) c = max a (max b c) 
6

はのは、あなたの最初の例では、いくつかのより多くの括弧をご紹介しましょう:

max3 a b c = (max a) ((max b) c) 

は今、あなたの中のものにそれを比較します最後の1:

max3 a b c = (max a) . ((max b) c) 

それとも、我々は接頭表記で(.)を書く場合:

max3 a b c = (.) (max a) ((max b) c) 

これでエラーが発生する理由がわかりました。

maxFloat :: Float -> Float -> Float 
maxFloat = max 

max3 a b c = max a . max b c 

今すぐエラーメッセージは次のとおりです。私たちが代わりにmaxの制約バージョンを使用している場合我々は、より良いエラーメッセージが表示されます

(.)  :: (b  -> c ) -> (a -> b ) -> a -> c 
max a  :: Float -> Float 
max b c ::       Float 
            ^^^^^^^^^^^ 

:入力チェックをするためには、(max b) c機能する必要があります多くの方:言われていること

Couldn't match expected type ‘a0 -> Float’ with actual type ‘Float’ 
Possible cause: ‘maxFloat’ is applied to too many arguments 
In the second argument of ‘(.)’, namely ‘maxFloat b c’ 
In the expression: maxFloat a . maxFloat b c 

、ましょうACTU (。):味方問題に取り組むあなたも

max3 :: Ord a => a -> a -> a -> a 
max3 a b = max a . max b 
関連する問題