2016-04-17 7 views
0

私は、差分リストを調査し、私は、関数の非点無料版は何か疑問に思ってDListタイプHaskellの差リストとポイントフリー機能

newtype DList a = DL { unDL :: [a] -> [a] } 

と機能

dlToList :: DList a -> [a] 
dlToList = ($[]) . unDL 

を発見しました。 ($[])は何をしていますか?

答えて

2

機能のポイントフリーの定義に見ての最初のステップは、η -reductionを元に戻すことです。

dlToList = ($[]) . unDL 
dlToList dl = (($[]) . unDL) dl 

その後、あなたは右から左へ、組成チェーンに適用を開始:

dlToList dl = ($[]) (unDL dl) 

オペレータセクション&daggerをアンパックできます。

dlToList dl = unDL dl $ [] 

これは、差分リストと通常のリストの間の本質的なコンバータであるため、しかし、それは実際にあるよう($[])を維持することは、理にかなって:それは[a]->[a] -prepender機能を取り、ターミネータ[]に適用し、その結果具体的なリストで


† 我々は、さらにそれを簡素化することができます:

ちなみに、短いようにし、再びポイントフリー作ることができる、
dlToList dl = unDL dl [] 

dlToList = (`unDL`[]) 

+0

はまた、あなたはどうするか私に説明することができますがこれは機能しますか? 'emptyDL :: DList a' ' emptyDL = DL id' –

+0

空の相違点リストは、(空の)ターミネータリストが渡されたときにその結果と同じリストを与えるだけのリスト前置機能です。 – leftaroundabout

+0

しかし、DL ::([a] - > [a]) - > DList aと 'id :: a - > a 'の型を見ると、 –