9

私が書く場合:

> let xs = [1,5,19,2,-3,5]
> foldr max 0 xs
19

> foldr1 max xs
19

そして、私が書くと(私は知っています、初期値はここでは一般的な最大値関数では正しくありません...):

> let maximum' = foldr max 0
> maximum' xs
19

しかし、私が書くと:

> let maximum2' = foldr1 max
> maximum2' xs

応答は次のとおりです。

<interactive>:61:11:
    Couldn't match expected type `()' with actual type `Integer'
    Expected type: [()]
      Actual type: [Integer]
    In the first argument of maximum2', namely `xs'
    In the expression: maximum2' xs

私はHaskellが初めてです。私は何を間違っていますか?foldr1(エラーメッセージを解読できません... max) ありがとう。

編集(回答を受け入れた後):

デフォルトルールの効果の例をさらにいくつか示すために(回答でもこれらについて説明しています):

例 1:

> let max' = max
> :t max
max :: Ord a => a -> a -> a

> :t max' 
max' :: () -> () -> ()

例 2:

> let plus = (+)
> :t (+)
(+) :: Num a => a -> a -> a

> :t plus 
plus :: Integer -> Integer -> Integer
4

1 に答える 1

13

問題は、型のポリモーフィズムと GHCi のデフォルト設定に関係しています。の型maxはポリモーフィックです。

> :t max
max :: Ord a => a -> a -> a

の場合maximum'、コンパイラはそれaがある種の数値であることを認識し、GHCi はその数値をデフォルトで Integer に設定します。

> :t maximum'
maximum' :: [Integer] -> Integer

その場合、maximum2'手がかりが少なく、デフォルトaでユニット タイプになります。

> :t maximum2'
maximum2' :: [()] -> ()

型シグネチャを提供すれば、すべて問題ありません。

> let maximum3' :: Ord a => [a] -> a ; maximum3' = foldr1 max
> :t maximum3'
maximum3' :: Ord a => [a] -> a

GHCi のデフォルト ルールは、型が省略されている他の特定のケースをより簡単にするためにあると思います

于 2013-09-06T16:10:23.320 に答える