这是个问题:
"写的是计算列表的平均值的功能,即通过其长度划分列表中的所有元素的总和.(您可能需要使用fromIntegral功能列表的长度将从一个整数到浮点数.)"
首先我试过这个:
mean :: [Double] -> Double
mean [] = 0
mean (x:xs) = (x + mean xs) / (1 + mean xs)
Run Code Online (Sandbox Code Playgroud)
但它给了我奇怪的结果,例如,当我像这样使用它时:
mean [2,4,6]
Run Code Online (Sandbox Code Playgroud)
它给我的结果:1.41176
它应该是:4
为什么?
我尝试了另一件事:
mean :: [Double] -> Double
mean list = (summ list) / (count list)
where count [] = 0
count (x:xs) = 1 + count xs
summ [] = 0
summ (x:xs) = x + summ xs
Run Code Online (Sandbox Code Playgroud)
但是当我试图将文件加载到GHC时,我有一个错误.
错误是:
parse error on input 'count'
Failed, modules loaded: none
Run Code Online (Sandbox Code Playgroud)
再一次,我做错了什么?
最后,我尝试了这个(成功): …
好吧,这是使用foldr定义过滤函数:
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
Run Code Online (Sandbox Code Playgroud)
例如,假设我有这个功能:
myFilter odd [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
所以它将是:
foldr step [] [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
这将是
step 1 (foldr step [] [2,3,4])
Run Code Online (Sandbox Code Playgroud)
这将是
step 1 (step 2 (foldr step [] [3,4]))
Run Code Online (Sandbox Code Playgroud)
这将是
step 1 (step 2 (step 3 (foldr step [] [4])))
Run Code Online (Sandbox Code Playgroud)
这将是
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
Run Code Online (Sandbox Code Playgroud)
并且foldr step [] []是[] …
如果我这样做any isUpper "asBsd",我会得到的True.
这里,第二个元素any是一个字符串.
但是,如果我这样做:
any ("1" `isInfixOf`) ["qas","123","=-0"]
Run Code Online (Sandbox Code Playgroud)
第二个元素any是一个字符串列表.
如何以及为什么这两个功能之间存在差异?
另一个例子.
如果我写filter isUpper "asdVdf",我会得到"V".
这里,要过滤的第二个元素是一个字符串.
但是,如果我这样写:
filter (isUpper . head) ["abc","Vdh","12"]我会得到的["Vdh"].
如您所见,要过滤的第二个元素现在是一个字符串列表.
为什么存在差异以及haskell如何知道它在两种情况下都是正确的?
总结一下:
我不明白在同一个函数中,有一次haskell得到第二个元素是一个字符串,而在其他时候,haskell得到一个字符串列表,在第二个元素中.
有一次它发生在any功能上,另一次发生在filter功能上.
haskell(和我)怎么知道它在两种情况下都是正确的?
谢谢 :-).