Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 当在where子句中定义时,为什么下列函数不在范围内? 导入数据.Char(chr,ord) num2Str::Int->String num2Str n | nChar; num2Chr n=chr(97+n`mod`26) }_Haskell - Fatal编程技术网

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)