2016-10-14 9 views
2

insufficiently-polymorphicなぜリストAは `実装するが少ない方法です - >リストA`その後、`リストのChar - - >リストのChar - >リスト>リストChar`

で著者はについて言います: def foo[A](fst: List[A], snd: List[A]): List[A]

機能を実装する方法が少なくなります。特に、 は、 の任意の型の値を作成する能力がないため、リスト内の一部の要素をハードコードすることはできません。

[Char]バージョンでは、我々はタイプ[Char]のそれらを持っていた任意のタイプの値がなぜそこにこれを実現するために以下の方法があり製造する能力がなかったので、私は、このことを理解していませんでしたか?

+2

私は著者が「リストa」を構築する方法がないと仮定していますが、リストCharを構築する方法があります。 Stringリテラルを使用します。あなたは引数を無視し、ハードコードされたStringを返すことができます。 –

+0

なぜ人々はこれに 'haskell'タグを付け続けますか?それは純粋にScalaについてのようです。 – dfeuer

答えて

5

汎用リストでは、任意のタイプAの新しい値を作成する方法がないため、出力リストにはfstsndに含まれる要素の一部の配列しか含めることができません。対照的に、出力タイプがCharであることがわかっている場合は、あなたは彼らが何であるかを知らないので、あなたは、出力に影響を与える意思決定を行うために、入力リストに含まれる値を使用することはできません。また

def foo(fst: List[Char], snd: List[Char]) = List('a', 'b', 'c') 

。入力タイプがわかっている場合は、これを行うことができます。

def foo(fst: List[Char], snd: List[Char]) = fst match { 
    case Nil => snd 
    case 'a'::fs => snd 
    case _ => fst 
} 
3

例えば、私が空でないList aを構築する方法はありませんことを、著者の手段を想定していますが、List Charを構築する方法がありますStringリテラルを使用します。あなたは引数を無視し、ハードコードされたStringを返すことができます。 この例は次のようになります。

foo :: List Char -> List Char -> List Char 
foo a b = "Whatever" 

あなたは、任意のタイプaの値を構築することはできませんが、タイプCharの値を構築することができます。

+1

'リスト 'を構築する方法、つまり' [] 'があります。 –

2

これは、すべての多型関数に適用される"parametricity"または "フリー定理"と呼ばれるプロパティの単純なケースです。

アンより簡単な例は以下の通りです:それはその入力を「読み」、それに応じて行動することができるので、これは後継者、前任者、正方形、階乗など:

fun1 :: Int -> Int 
fun2 :: forall a. a -> a 

fun1は何もすることができます。

fun2は、同一性機能(または永遠にループ)である必要があります。これはfun2が入力を受け取りますが、有用な方法でそれを調べることができないためです。抽象的な、タイプが未知のaであるため、操作は実行できません。入力は事実上不透明なトークンです。 foo2の出力はタイプaでなければなりません。そのため、構成方法はわかりません。aの値は何も作成できません。唯一の選択肢は、入力をaとし、それを使用して出力aを作成することです。したがって、fun2は同一性です。

上記の結果は、入力またはタイプaでテストを実行する方法がない場合に成り立ちます。例えばif x.instanceOf[Int] ...、またはif x==null ...を許可するか、(OOPで)タイプキャストすれば、他の方法でfun2と書くことができます。

+0

とても涼しい!!それはジェネリックのように私には、コードがより多くのことをすることができるようになったように見えた:)今私はそれがコードをより少ないものを行うことができます。 – Jas

+1

@Jas Fun exercise: 'fun3 :: forallを持つことができる関数を推測する。 a - > a - > a' - ここではいくつかのオプションしか適用されません。 – chi

+0

私は 'a - > a - > a'をどのように考えるべきですか?私は現在、2つの引数と1つの戻り値を持つ関数としてこれを正しい方法と考えていますか? (すべて同じ型) – Jas

関連する問題