私が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
でそれらを修飾すると、問題は発生しません)。
リスト 'sum'は' Prelude'の中にあります。すなわち、デフォルトではスコープ内にあるので、何か特別なことをしなければ、それを使います。別の 'sum'を参照するには、' Data.Foldable'をインポートする必要があります。あなたの疑問は何ですか?多少の曖昧さがある場合、コンパイラはそれについて報告する必要があります。 – laughedelic
@laughedelic最近のGHCリリースでは、Preludeの 'sum'は' Data.Foldable'のものと同じです。 – duplode
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