このエラーは、コードが適切に型付けされておらず、意味がないことを示しています。
あなたの機能:
sumHR = foldr (+) 0 (\x -> map (1/) [1..x])
検討:
Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
したがって、これが真であるために(+)
は、 が最初の引数であり、型を統一する (a -> b -> b
および にNum a => a -> a -> a
統一するNum a => a -> a -> a
) 必要があります。
2 番目の引数には variable 型が指定されますがb
、これは既に である必要があることがわかっていますNum a => a
。これで問題ありません0
。2 番目の引数として指定しました。
3 番目の引数は type と一致する必要がありNum a => [a]
ます。ただし、関数である 2 番目の引数を指定しました。
Prelude> :t (\x -> map (1/) [1..x])
(\x -> map (1/) [1..x]) :: (Enum b, Fractional b) => b -> [b]
(Enum b, Fractional b) => b -> [b]
の型を同じにする方法をコンパイラに示すことができない限りNum a => [a]
、あなたは立ち往生しています。
次のような関数を使用している可能性があります。
sumHR x = foldr (+) 0 (map (1/) [1..x])