gpt4 book ai didi

haskell - 为什么以下函数在 where 子句中定义时不在范围内?

转载 作者:行者123 更新时间:2023-12-02 09:10:46 25 4
gpt4 key购买 nike

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)
}

这导致错误
    * Variable not in scope: num2Chr :: Int -> Char
* Perhaps you meant `num2Str' (line 132)
|
132 | num2Str n | n < 26 = [num2Chr 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)

最佳答案

num2Char函数不在第一个定义的范围内 num2Str n | n < 26因为where子句仅“作用域”到第二个定义 num2Str n .规避问题的最简单方法是通过将函数分开来修改函数,如下所示:

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)

为了完整性、简洁性和正确性,我会推荐上述样式。

关于语法的旁注:不要在 where 子句周围使用括号,也不需要分号。

如果你真的想保持代码相似并说明我的意思 where条款:
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)

这是有效的,但风格很差。每个 where作用域是它上面的函数。更多信息和引用: http://learnyouahaskell.com/syntax-in-functions#where

关于haskell - 为什么以下函数在 where 子句中定义时不在范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52508801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com