wil*_*ace 0 haskell functional-programming
我正在尝试使用下面的函数计算谐波系列.但是有一个类型错误,不太确定它是什么意思?另一个问题,为什么[5..1]会给出一个空列表?
sumHR = foldr(+)0(\ x - > map(1 /)[1..x])
错误信息:
*** Expression : foldr (+) 0 (\x -> map (1 /) (enumFromTo x 1))
*** Term : \x -> map (1 /) (enumFromTo x 1)
*** Type : b -> [b]
*** Does not match : [a]
Run Code Online (Sandbox Code Playgroud)
错误告诉您,您的代码没有良好的类型,因此没有意义.
你的功能:
sumHR = foldr (+) 0 (\x -> map (1/) [1..x])
Run Code Online (Sandbox Code Playgroud)
考虑:
Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)
所以这是真的,(+)是第一个参数,类型必须统一(a -> b -> b并Num a => a -> a -> a统一Num a => a -> a -> a).
第二个参数是给定的类型变量b,我们已经知道它必须是Num a => a.这很好,你提供0了第二个参数.
第三个论点必须与类型一致Num a => [a].但是,您提供了第二个参数,它是一个函数:
Prelude> :t (\x -> map (1/) [1..x])
(\x -> map (1/) [1..x]) :: (Enum b, Fractional b) => b -> [b]
Run Code Online (Sandbox Code Playgroud)
除非您能够向编译器显示如何使一种类型(Enum b, Fractional b) => b -> [b]与之相同,Num a => [a]否则您将被卡住.
您可能拥有以下功能:
sumHR x = foldr (+) 0 (map (1/) [1..x])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |