2016-05-31 9 views
2

セイと呼ばれ、そこからインスタンスを指定するには?より正確には、bがbのインスタンスからではなく、この型のクラスにある別の型である場合、fのインスタンスをaから指定する方法はありますか?どのようにすべてのインスタンスに対して、この型クラスのIは、関数、私はFを呼び出すことができますどのように</p> <pre class="lang-haskell prettyprint-override"><code>f :: [Bool] -> Maybe (a, [a]) </code></pre> <p>を持っていることを、私は、このようなタイプのクラスを持っている機能が

答えて

7

タイプアノテーションを追加する必要が生じることがあります。型クラスReadを考えてみましょう:

class Read a where 
    read :: String -> a 

あなたは整数1を得ることを期待read "1"をしようとするタイプaが何であるかを知る方法はありませんので、あなたの代わりにエラーが発生します。ただし、これは動作します:read "1" :: Int

コンパイラがaが何であるか把握できる状況で、関数fを使用している場合、正常に動作します。それ以外の場合は、適切な型の注釈を追加してコンパイラを支援する必要があります。

3

typeclassインスタンスは、宣言されている特定の型によって索引付けされます。例えば、次のような場合には:

class YourClass a where 
    f :: [Bool] -> Maybe (a, [a]) 

instance YourClass Int where 
    f = error "Define me" 

instance YourClass Char where 
    f = error "Define me" 

YourClassの2件のユニークなインスタンスがあります。 1つは、aIntであるときにピックアップされ、もう1つがCharであるときピックアップされます。インスタンスは、f関数が実際に適用される型を使用して自動的に解決されます。

fのように特定のシグニチャ[Bool] -> Maybe (Int, [Int])がある場合はいつでも、Intのインスタンスが自動的に取得されます。 Haskellも非常に強力な型推論を持っているので、この特定のシグネチャはほとんどの場合に指定する必要はなく、コンパイラはコンテキストから自動的に解決します。

基本的に、インスタンスを持っているすべての型でその関数を使い、残りの作業をコンパイラが安全に行うことができると期待しています。

+0

え、 'Num'、' Read'ワーキング 'Show' ... – dfeuer

+1

[OK]を、しかし、状況があり、これは曖昧されたときにアレント?たとえば、私の特定のケースでは、次のようなcase式でfを使いたいとします:case f xs of Nothing - > something ... Just(a、as)) - >何か... haskellはどのように私が知っていますか?を使用して? – user3726947

+1

@ user3726947この式を持つ関数が特定の型 "a"を気にしない場合、それは多相関数であり、 'f2 ::(YourClass a)=> a - > ... ' –

3

他の回答を補足するために、実際にはあいまいなケースがあることを指摘したいと思います。例えば

class C a where 
    f :: String -> a 
instance C Int where 
    f s = length s 
instance C Bool where 
    f s = s == "hello!" 

main :: IO() 
main = print (f "testing") 

今、printが任意(Showできる)タイプを受け付け、f "testing"の両方IntBoolを生成することができます。これは、上記のプログラムが "False"と "7"を印刷する可能性があるため、本質的にあいまいです。コンパイラがそれを理解できる方法はありません。

解決策として、我々は

main = print (f "testing" :: Int) 
-- or 
main = print (f "testing" :: Bool) 

を明確にするために使用することができます。あまり便利ではないもう1つの選択肢は、GHC 8でさえ、012Hである。上の右の拡張子を持つ0、

main = print (f @ Int "testing") -- explicit choice for type a 

注しかし、いくつかの状況でそこには曖昧さがなく、GHCは驚異を行うことができます。例えば:&&Bool、およびlength戻りInt+が同じ型を持つように二つの引数を強制しながら、を必要とするため

main = print (f "testing" && True)   -- Bool is chosen here 
main = print (f "testing" + length [1,2]) -- Int is chosen here 

これは(そうf "testing"も同様Intでなければならない)です。

また、

bar :: Bool -> Float 
bar b = ... 

main = print (bar (f "testing)) -- Bool is chosen 
関連する問題

 関連する問題