2017-03-05 9 views
1

enter image description here関数 `selfApp`を本の中で書く*タイプとプログラミング言語*をスカラーに書く

この関数はScalaで書くことができますか?それとも他の言語ですか?

+0

ラムダ微積分の背景のない人は、表記を翻訳してください。 – davidrpugh

+0

@davidrpugh 'selfApp(f:[X] X => X):[X] X => X = f(f)'のようなものです。 – sepp2k

+0

"この関数をScalaや他の言語で書くことはできますか?" - はい、そうです。実際には、あなたはすでにあなたの質問に「他の言語」の実装を掲載しています。 –

答えて

2

余分なオブジェクトに関数をラップすることなく、Scalaでは可能ではないと思います。そうするための一つの方法は、次のようになります。

type XtoX = {def apply[X](x: X): X } 
def selfApp(f: XtoX): XtoX = f(f) 

今、あなたは、このような適切な型の適用方法でオブジェクトを定義することができます

object ID { def apply[X](x: X): X = x } 

そしてselfApp(ID)としてselfAppを呼び出し、単に返しれますそれが与えられたオブジェクト。しかし、これは動作しません。

def id[X](x: X): X = x 

selfApp(id) 

も、あなたは匿名関数x => xを使用することができます。これは、メソッドまたは匿名関数を渡すとき、FunctionNオブジェクトとして表現され、FunctionN形質は単体(すなわち、非汎用)apply関数を持つためです。そのため、オブジェクトapplyを明示的に作成する必要があります。


Haskellでは

次のようなRankNTypes拡張子を使用して、任意のラッピングせずにそれを行うことができます:あなただけを気にせずに関数を書くことができ、動的型付け言語で


そしてもちろんの

{-# LANGUAGE RankNTypes #-} 
selfApp :: (forall x. x -> x) -> (forall x. x -> x) 
selfApp f = f f 
タイプはまったくありません。例:Pythonの場合:

def id(x): return x 
def selfApp(f): return f(f) 
print(selfApp(id)(42)) # Just works - no extensions, no wrapping, no nothing 
+0

http://scalaz.github.io/scalaz/scalaz-2.9.0-1-6.0.1/doc.sxr/scalaz/Forall.scala.html#13208 RankNTypesはscala/javaのオブジェクトとして実装されていますか? – molikto

+0

@moliktoはい、またはもっと正確に:すべての関数はScalaではオブジェクトとして実装されていますが、上位のものは(scala.Function1などではなく)カスタム特性を実装するオブジェクトとして表現する必要があります。 – sepp2k

関連する問題