2016-03-22 6 views
1

このタグには初めての投稿がありますが、私はまだその言語で暫定的な手順を取っていますが、いくつかの動的FPの背景があります。あいまいな種類の組成

私はisZero関数を定義しました。

isZero :: Int -> Bool 
isZero x = x == 0 

そして、私はisMultiple関数を作成するmod機能とそれを構成しようとしています。

isMultiple = isZero . mod 

署名がa0 -> Intmoda0 -> a0 -> a0であることを期待しているためしかし、これは(それが複数の精度をサポートしているためであると仮定して)、型の不一致が生じます。

私が気付いたのは、明示的に(型署名を提供する)場合、問題はありません。

isMultiple :: Int -> Int -> Bool 
isMultiple x n = isZero $ mod x n 

.演算子を使用してあいまいなタイプのコン機能を使用する方法はありますか?

+2

'\ x - > isZero。 mod x = \ x - >(。)isZero(mod x)=(。)isZero。 mod ' – user2407038

答えて

6

さて、isMultipleのあなたの最初の定義で種類を見てみましょう:あなたが見ることができるように

(.)   :: (b -> c ) -> (a -> b   ) -> a -> c 
isZero   :: Int -> Bool 
mod   ::     Int -> Int -> Int 
        -- same as  Int -> (Int -> Int) 

は、両方のb年代が同じではありません。それがうまくいかない理由です。しかし、人はそれが仕事を得ることができますが、それはもう目にそれは容易ではありません。

isMultiple = (isZero.) . mod 
      = ((.) isZero) . mod 
      = \x -> ((.) isZero) . mod $ x 
      = \x -> ((.) isZero) (mod x) 
      = \x -> (.) isZero (mod x) 
      = \x -> isZero . mod x 

あなたが見ることができるように、mod xInt -> Int型を持つので、(.)isZeroを有する組成物に適しています。

+0

だから、不一致は' Int'を期待して 'Int(Int - > Int)'を得るLHS 'b'でしょうか?だから問題は2つ以上の引数を期待する関数を構成しているのでしょうか? –

+2

@DanPrince:基本的にはyesです(この場合、 'map。mod'にはこの問題はありませんが、それにはセマンティクスがあります)。しかし '(。)'の別のアプリケーションでこれを回避することは可能です。 [ツール](http://pointfree.io/)がありますが、可能であれば3ヶ月であなたの酔っ払いの自己によってコードを読めるようにしておいてください。 – Zeta

関連する問題