2016-11-15 23 views
1

私はハスケルを初めて使っているので、これは愚かな質問かもしれません。私は:type sumsum :: (Num a) => [a] -> aと表示されるはずの本を読んでいます。代わりに、メッセージはsum :: (Num a, Foldable t) => t a -> aです。私がhttps://www.haskell.org/hoogle/?hoogle=Sumで見たように、この違いは、私が思うに、2つの異なるサム関数の存在によるものです。多分Javaの多態性のようなものです、私はちょうど始まりです、そして、私はHaskellがどのように動作するのか全く分かりません。合計機能の種類が異なる

私の質問は次のとおりです。どのタイプのsum関数を他のものの代わりにsum :: (Num a) => [a] -> aに使うことができますか?ここで何が起こっているのか教えてください。

+0

リスト 'sum'は' Prelude'の中にあります。すなわち、デフォルトではスコープ内にあるので、何か特別なことをしなければ、それを使います。別の 'sum'を参照するには、' Data.Foldable'をインポートする必要があります。あなたの疑問は何ですか?多少の曖昧さがある場合、コンパイラはそれについて報告する必要があります。 – laughedelic

+3

@laughedelic最近のGHCリリースでは、Preludeの 'sum'は' Data.Foldable'のものと同じです。 – duplode

+4

GHC 7.10以降、Preludeのいくつかの関数は一般化された署名を持っています。 'sum :: Num a => [a] - > a'という新しい' sum ::(Num a、Foldable t)=> ta - > a'はまだリスト上で動作しています([Sequences](https://hackage.haskell.org/package/containers-0.5.8.1/docs/Data-Sequence.html)や[Sets](https:// hackage)で動作します。 .haskell.org/package/containers-0.5.8.1/docs/Data-Set.html)) – Alec

答えて

2

私がhttps://www.haskell.org/hoogle/?hoogle=Sumで見たように、この違いは2つの異なるサム関数の存在によるものです。多分Javaの多形性のようなものかもしれません

これは実際には多形ではありますが(この回答の最後にあるP.S.を参照)。なお...

sum :: (Num a) => [a] -> a 

...合算されている数字のタイプにすでに多型であるので、それはで動作するだろう、Integerのインスタンスのための、リストやDoubleのリスト。 sumと一緒に使用される容器の種類について

GHCi> -- +t makes GHCi print the types automatically. 
GHCi> :set +t 
GHCi> sum [1 :: Integer, 2, 3] 
6 
it :: Integer 
GHCi> sum [1 :: Double, 2, 3] 
6.0 
it :: Double 
GHCi> import qualified Data.Set as S 
GHCi> :t S.fromList 
S.fromList :: Ord a => [a] -> S.Set a 
GHCi> sum (S.fromList [1 :: Double, 2, 3]) 
6.0 
it :: Double 

:それとの差...は

sum :: (Num a, Foldable t) => t a -> a 

...このsum容器のタイプの多型であることですsumのように、コンテナをリストに平坦化して何らかの方法で折りたたむという機能をカバーするthe Foldable classのインスタンスを持っていなければなりません。

P.S .:あなたの本はあなたが見たものとは違ったことを言っています。かなり前に、プレリュードのsumの機能はあまり一般的でないリスト固有のタイプを持ち、あなたの本はその変更に先立ちます。 sumという2つの異なる機能を持っていると、厳密には他よりも一般的であっても、名前の衝突につながります(上記の例ではData.Setモジュールをインポートしたのと同様の理由があります)。それは、Prelude関数と衝突するmapのようないくつかの関数を定義しており、例えばS.mapでそれらを修飾すると、問題は発生しません)。

関連する問題