2017-02-01 8 views
0

機能します。手伝ってくれますか?コメント欄で述べたように、より興味深いものにするために型を変更ランク3種類は、私はこのランク3種類の関数定義を持っている例

+0

最初の引数をすべて無視します: 'f3 _ = id'。 – Alec

+0

多少複雑ですが、おそらくすべてのパラメータが定義されています。 – Randomize

+1

ここに、事があります。 a - > a 'は1つの(発散しない)メンバー: 'id'のみを持つ。それで '(for a a - > a) - > Int'の議論をするのは面白いことではありません。あなたはすでに' id'だけしか知りませんので、 '(forall a。a - > a ) - > Int'はある一定の関数でなければならない。 f3の興味深い(分岐しない)実装と 'f3 ':: Int-> Bool-> Bool'の実装の間には、双方向性があります。 – Alec

答えて

3
f3 :: ((forall a. a -> a) -> Int) -> Bool -> Bool 
f3 f b = (f id == 3) && b 

f3_ex :: Bool 
f3_ex = f3 f True where 
    f :: (forall a. a -> a) -> Int 
    f g = g 3 

f4 :: ((forall a. a -> a -> a) -> Int) -> Bool -> Bool 
f4 f b = (f const == 3) && b 

f4_ex :: Bool 
f4_ex = f4 f True where 
    f :: (forall a. a -> a -> a) -> Int 
    f g = g 3 5 


f5 :: ((forall a. a -> a -> a) -> Int) -> Bool -> Bool 
f5 f b = f (if b then const else const id) == 42 

f5_ex :: Bool 
f5_ex = f5 f True where 
    f :: (forall a. a -> a -> a) -> Int 
    f g = g 3 5 + 39 

ここfは、タイプ(Int, Int)本質的f constによって与えられる第1成分とf (const id)又はによって与えられる他のものです同等にf (flip const)

+0

実際に 'f3'、' f4'、 'f5'をどのように呼びますか?どのパラメータを渡しますか? – Randomize

+0

@Randomizeいくつかの例を追加しました。 – chi

+0

ありがとう! – Randomize