我在以下练习中遇到了一些问题:
我应该编写一个函数,即3个数字,xyn,x和y分别是列表推导的底部和上限,n是理解所具有的分区数。
E.g:
function getFirstWord(str) {
let spacePosition = str.indexOf(' ');
if (spacePosition === -1)
return str;
else
return str.substr(0, spacePosition);
};
我所做的是以下内容:
λ> partition 10 20 4
[10.0, 12.5, 15.0, 17.5, 20.0]
我不明白为什么我无法在理解中定义b变量的值,因为当我尝试运行它时,我收到以下错误消息:
partition :: Double -> Double -> Double -> [Double]
partition x y n = [a+b | b = (y-x) / n , a -> [x,b..y]]
注意:这应该是一个初学者练习,这应该有一个简单的解决方案
答案 0 :(得分:8)
您只需使用let
关键字:
partition x y n = [a+b | let b = (y-x)/n , a <- [x,x+b..y]]
然后您可以根据需要使用b
:
λ partition 10 20 4
[12.5,15.0,17.5,20.0,22.5]
答案 1 :(得分:3)
有什么变数?一切都是不可改变的:)
你想要的是let
表达式:
partition x y n = [let b = (y-x)/n in a+b | a <- [x,b..y]]
还要注意箭头的方向:它来自列表表达式a
,而不是相反。
将公共子表达式从理解中移开看起来更自然:
partition x y n = let b = (y-x)/n in [a+b | a <- [x,b..y]]