下面的代码片段是尝试创建函数 generateUpTo 的一部分,该函数会生成一个列表 pAllSorted ,该列表依赖于 nmax ,因此的 RMAX 即可。
nmax = rmax `div` 10
pass = rmax `elem` mot
fail = rmax `notElem` mot
generateUpTo rmax = check rmax
where
check pass = pAllSorted
check fail = error "insert multiple of 10!"
但是,在尝试编译时,编译器会在(在这里)第1,3和4行中给出 rmax 的“不在范围内”错误。
(如何)在使用 generateUpTo 功能之前,我可以保留 rmax 吗?
答案 0 :(得分:9)
如果您想在rmax
,nmax
和pass
内使用fail
而不将其作为争议传递,则需要将其包含在{where
中1}} generateUpTo
的阻止。否则,它实际上是“不在范围内”。例如:
generateUpTo rmax = check rmax
where
check pass = pAllSorted
check fail = error "insert multiple of 10!"
nmax = rmax `div` 10
pass = rmax `elem` mot
fail = rmax `notElem` mot
如果你想在多个地方使用这些功能,你可以加入rmax作为争论:
nmax rmax = rmax `div` 10
pass rmax = rmax `elem` mot
fail rmax = rmax `notElem` mot
注意 - 您对check
的定义看起来也有问题...... pass
和fail
值只有check
的争论,以及不是你上面定义的功能。
<强>更新强>
要使用nmax(where-the-block-block范围版本),您需要将rmax的值传递给它。像这样:
nmax rmax -- function application in Haskell is accomplished with a space,
-- not parens, as in some other languages.
但请注意,rmax
定义中的名称nmax
不再重要。这些功能完全相同:
nmax rmax = rmax `div` 10
nmax a = a `div` 10
nmax x = x `div` 10
同样,您无需使用名为rmax
的值来调用它。
nmax rmax
nmax 10 -- this is the same, assuming rmax is 10
nmax foo -- this is the same, assuming foo has your 'rmax' value.
答案 1 :(得分:4)
只需将nmax
,pass
和fail
的定义放入where
的{{1}}条款中,就像使用generateUpTo
一样
答案 2 :(得分:2)
nmax rmax = rmax `div` 10
pass rmax = rmax `elem` mot
fail rmax = rmax `notElem` mot
generateUpTo rmax = check rmax
where
check pass = pAllSorted
check fail = error "insert multiple of 10!"
rmax是一个函数参数,它在声明它的函数之外是未定义的。在该示例中,函数nmax中的rmax与generateUpTo中的rmax完全无关。