误用 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']
我正在 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']