Haskell:开始时出现函数分析错误

Haskell:开始时出现函数分析错误,haskell,Haskell,我是haskell的初学者,正在尝试执行密码验证函数 validateCipher :: [Char] -> Bool validateCipher cipher = if length $ nub cipher == length cipher then return True else return False 当我通过ghci运行它时,它只告诉我:错误:在输入“validateCipher”时解析错误。。 不确定出了什么问题,我

我是haskell的初学者,正在尝试执行密码验证函数

 validateCipher :: [Char] -> Bool
 validateCipher cipher =
       if length $ nub cipher == length cipher  
        then return True
        else return False
当我通过ghci运行它时,它只告诉我:错误:在输入“validateCipher”时解析错误。
不确定出了什么问题,我是否应该添加Eq或任何东西(我也不确定它能做什么)?

这里有两个错误:

  • 您可以使用
    return
    。在Haskell中没有
    return
    关键字,有一个函数,但工作方式不同;及
  • $
    导致将
    length$nub cipher==length cipher
    解析为
    length(nub cipher==length cipher)
    ,这不满足类型约束,因为
    nub cipher
    返回
    [Char]
    ,而
    length cipher
    将返回
    Int
  • 首先,我们不需要
    返回True
    ,或者
    返回True
    ,因为我们可以只返回检查条件的结果。我们还可以使用括号编写正确的表达式:

    validateCipher :: [Char] -> Bool
    validateCipher cipher = length (nub cipher) == length cipher
    validateCipher::[Char]->Bool
    
    validateCipher cipher=长度(nub cipher)==长度密码
    删除
    返回值
    。在Haskell中没有
    return
    关键字,只有
    return
    函数。此外,
    $
    将其解析为`length(nub cipher==length cipher),因此您应该使用括号。Q1原因是我在Haskell中搜索并发现有人使用return True。。。。。非常感谢您提供了一个更可靠的答案。@GTTT:对于一元计算,例如
    IO
    可能
    ,等等。有时确实可以使用
    返回
    。但是对于非一元的,比如这里的一个,我不完全理解$operator,但是现在由于你的解释,我会对此更有信心!thx alot@GTTT:
    ($)
    是一个优先级很低的运算符(),它基本上用于将左侧的部分和右侧的部分分组,并生成函数应用程序。所以,
    …$
    ,几乎总是等同于
    (…)(…)
    (但不带括号)。