Haskell - 这个函数出了什么问题?

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)

Tho*_*son 7

错误告诉您,您的代码没有良好的类型,因此没有意义.

你的功能:

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 -> bNum 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)