误用 haskell 中的 where

misusage of the where in haskell

我正在 haskell 训练,我想了解我哪里做错了。

错误是臭名昭著的“变量不在范围内”

上下文是判断一个句子是不是pangram。 pangram(希腊语:παν γράμμα,pan gramma,“每个字母”)是一个句子,每个字母至少使用一次。

例如:

敏捷的棕色狐狸跳过懒惰的狗。

代码如下:

module Pangram (isPangram) where

isFalse n = n == False

transformText :: String -> [Bool]

transformText text =  [letter elem alphabet | letter <-text] where alphabet = "abcdefghijklmnopqrstuvwxyz"

isPangram :: String -> Bool
isPangram [] = False
isPangram text = case test of
         Just _ -> False
         Nothing -> True
            where test = find isFalse (transformText text)

where 应该与 case 部分绑定,所以:

isPangram :: String -> Bool
isPangram [] = False
isPangram text = case test of
         Just _ -> False
         Nothing -> True
    where test = find isFalse (transformText text)

但是您可以简化它。 isFalse 等同于 not :: Bool.

您的程序也不会测试是否使用了每个字母,它会检查字符串中的每个项目是否都是字母。

您可以将测试替换为:

isPangram :: String -> Bool
isPangram text = all (`elem` text) ['a' .. 'z']