15

私はチュートリアルhttp://haskell.org/haskellwiki/How_to_write_a_Haskell_programを見ています

import System.Environment

main :: IO ()
main = getArgs >>= print . haqify . head

haqify s = "Haq! " ++ s

このプログラムをHLintで実行すると、次のエラーが発生します。

./Haq.hs:11:1: Warning: Eta reduce
Found:
  haqify s = "Haq! " ++ s
Why not:
  haqify = ("Haq! " ++ )

この文脈で「EtaReduce」が正確に何を意味するのかを誰かが明らかにすることはできますか?

4

3 に答える 3

22

の自由な発生がない限り、イータ削減はに変わり \x -> f xつつあります。ffx

それらが同じであることを確認するには、それらをいくつかの値に適用しますy

(\x -> f x) y === f' y -- (where f' is obtained from f by substituting all x's by y)
              === f y  -- since f has no free occurrences of x

の定義は、の構文糖衣であるhaqifyとして表示されます。つまり、演算子のセクション表記を使用して、または同等にeta-reducedすることができます。\s -> "Haq! " ++ s\s -> (++) "Haq! " s(++) "Haq! "("Haq! " ++)

于 2011-04-26T17:23:14.153 に答える
16

ええと、etaリダクションは(一方向で)ポイントフリー関数を作成することであり、通常、関数の最後のパラメーターが式の両側にある場合はそれを削除できることを意味します。

f :: Int -> Int
g :: Int -> Int -> Int
f s = g 3 s 

に変換することができます

f = g 3

(++)ただし、この場合、タイプがrhsに2パラメーター演算子の構文糖衣があるため、少し複雑になります[a] -> [a] -> [a]。ただし、これをより標準的な関数に変換できます。

 haqify ::  [Char] -> [Char]
 haqify = (++) "Haq! "

は演算子であるため(++)、他の可能性があります。

haqify = ("Haq! " ++ )

つまり、親はこれをその引数に適用される1パラメーター関数に変換します。"Haq!" ++

于 2011-04-26T17:26:07.497 に答える
13

ラムダ計算から、eta変換を等式として定義します。

 \x -> M x == M      -- if x is not free in M.

Barendregt、HP The Lambda Calculus:its Syntax and Semantics、1984を参照してください。


Haskellのコンテキストでは、Haskellwikiの定義を参照してください。

n eta変換(η-conversionとも呼ばれます)は、関数に対する抽象化の追加または削除です。たとえば、次の2つの値はη変換では同等です。

\x -> abs x

abs

1番目から2番目に変換すると、etaが削減され、2番目から1番目に移動すると、etaが抽象化されます。「eta変換」という用語は、どちらの方向のプロセスも指すことができます。η-reductionを広範に使用すると、Pointfreeプログラミングにつながる可能性があります。また、通常、特定のコンパイル時の最適化でも使用されます。

于 2011-04-26T17:26:49.693 に答える