Haskell 当在where子句中定义时,为什么下列函数不在范围内? 导入数据.Char(chr,ord) num2Str::Int->String num2Str n | nChar; num2Chr n=chr(97+n`mod`26) }
这将导致错误Haskell 当在where子句中定义时,为什么下列函数不在范围内? 导入数据.Char(chr,ord) num2Str::Int->String num2Str n | nChar; num2Chr n=chr(97+n`mod`26) },haskell,Haskell,这将导致错误 import Data.Char (chr, ord) num2Str :: Int -> String num2Str n | n < 26 = [num2Chr n] num2Str n = num2Chr n : num2Str (n - 26) where { num2Chr :: Int -> Char; num2Chr n = chr(97 + n `mod` 26) } *变量
import Data.Char (chr, ord)
num2Str :: Int -> String
num2Str n | n < 26 = [num2Chr n]
num2Str n = num2Chr n : num2Str (n - 26)
where {
num2Chr :: Int -> Char;
num2Chr n = chr(97 + n `mod` 26)
}
*变量不在范围内:num2Chr::Int->Char
*也许你的意思是‘num2Str’(第132行)
|
132 | num2Str n | n<26=[num2Chr n]
| ^^^^^^^
我尝试了一些布局的替代方案,但似乎都不起作用
次要更新
代码中有一些与问题无关的逻辑错误;以下是更正的版本:
* Variable not in scope: num2Chr :: Int -> Char
* Perhaps you meant `num2Str' (line 132)
|
132 | num2Str n | n < 26 = [num2Chr n]
| ^^^^^^^
导入数据.Char(chr,ord)
num2LcStr::Int->String
num2LcStr n | n<26=[num2Chr n]
|否则='z':num2LcStr(n-26)
哪里
num2Chr nn=chr(97+nn`mod`26)
函数不在第一个定义num2Str n | n<26
的范围内,因为where
子句仅“限定”到第二个定义num2Str n
。规避问题的最简单方法是通过分离函数来修改函数,如下所示:
import Data.Char (chr, ord)
num2LcStr :: Int -> String
num2LcStr n | n < 26 = [num2Chr n]
| otherwise = 'z' : num2LcStr (n - 26)
where
num2Chr nn = chr(97 + nn `mod` 26)
这是正确的,但风格很差。每个,其中
的作用域为其上方的函数。有关更多信息和参考资料:旁注:您还应该考虑如何处理负整数输入的情况。我有一种感觉,它将抛出我的第一个Haskell错误/异常,或任何等效的错误/异常。太好了,第一个选项就是我要解决的问题,而第二个选择显然是我已经忘记了并且正在寻找的。
import Data.Char (chr, ord)
num2Str :: Int -> String
num2Str n | n < 26 = [(num2Chr n)]
num2Str n = num2Chr n : num2Str (n - 26)
num2Chr :: Int -> Char
num2Chr n = chr(97 + n `mod` 26)
num2Str :: Int -> String
num2Str n | n < 26 = [(num2Chr n)]
| otherwise = num2Chr n : num2Str (n - 26)
where
num2Chr :: Int -> Char
num2Chr n = chr(97 + n `mod` 26)
num2Str :: Int -> String
num2Str n | n < 26 = [(num2Chr n)]
where
num2Chr n = chr(97 + n `mod` 26)
num2Str n = num2Chr n : num2Str (n - 26)
where
num2Chr n = chr(97 + n `mod` 26)