Haskell - 不在范围内

时间:2012-01-01 16:32:23

标签: haskell

下面的代码片段是尝试创建函数 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 吗?

3 个答案:

答案 0 :(得分:9)

如果您想在rmaxnmaxpass内使用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的定义看起来也有问题...... passfail值只有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)

只需将nmaxpassfail的定义放入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完全无关。