Haskellの最短のa-> b->(a-> b)関数


19

テストで次の質問がありました。

f次のタイプの関数を作成しますa -> b -> (a -> b)aまたb、いかなる意味においても束縛されるべきではありません。コードが短いほど良いです。

私は思いついたf a b = \x -> snd ([a,x],b)。もっと小さなものを見つけることができますか?

現在の勝者は: f _=(.f).const


より一般的なタイプが許可されている場合:f = const const
ハンマー14

@hammar:またはf _ b _ = b、しかし、質問の解決策を考えると、より一般的なタイプは許可されていないと思われます。
Tikhon Jelvis

6
より一般的なタイプが許可されている場合、なぜf = idですか?
トム・エリス

7
実際、より一般的なタイプが許可されている場合f = fは解決策なので、タイプの条件は非常に重要だと思います!
トム・エリス

2
より一般的なタイプは許可されていません、あなたの仮定は正しかったです。
ラドゥStoenescu

回答:


11

右側の匿名関数を削除することで、例を縮小できます。

f a b x = snd ([a,x],b)

これa -> b -> a -> bは、タイプがa -> b -> (a -> b)Haskell と同等であるため機能します。


4
少し短い修正:f a b x = snd (f x,b)
Ed'ka

5

この関数f _=(.f).constは、実際には、より一般的な型f :: a -> b -> (a -> b)、つまりf :: a -> b -> (c -> b)です。型シグネチャが指定されていない場合、型推論システムはの型を推測しますが、まったく同じ定義のf :: a -> b -> (a -> b)型シグネチャf :: a -> b -> (c -> b)を含めると、Haskellは問題なくそれをコンパイルし、fの部分的なアプリケーションに対して一貫した型を報告します。この場合、型推論システムが型チェックシステムよりも厳密な理由はおそらくあるでしょうが、なぜそうなるべきかについての理由を考え出すのに十分なカテゴリー理論は理解していません。納得できない場合は、自分で試してみてください。


の場合のようになりf a b = f a aます。それはタイプa -> a -> bに従うがタイプであると推測しますa -> b -> c。これはf、型が指定されていない場合、単相的にのみ使用できるためです。
誇りに思ってhaskeller 14

私はこれが問題になるとは思わない
誇りに思ってhaskeller 14

4

与えられたScopedTypeVariables、私はこれを思いついた:

f (_::a) b (_::a) = b

私の機能とあなたの機能の両方を縮小すると、私の髪は短くなります:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

もちろん、おそらくScopedTypeVariables:P に依存することは許されません。


3
これはf _=(.f).constサッサNFによる)ほど短くはありません。これも必要ありませんScopedTypeVariables
反時計回りに

うーん、私は最初に...これはリストであることを第一と第三引数が必要だろうと思った
クリス・テイラー

@ChrisTaylor:心のOCamlが多すぎますか?:)
ティコンジェルビス14

ああ、そうでなければならない!;)
クリステイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.