如何基于if / then / else语句定义变量

时间:2010-08-24 04:57:23

标签: haskell functional-programming if-statement

我正在尝试将一些python代码翻译为haskell。但是我达到了一个我不确定如何继续的地步。

if len(prod) % 2 == 0:
    ss = float(1.5 * count_vowels(cust))
else:
    ss = float(count_consonants(cust)) # muliplicaton by 1 is implied.

if len(cust_factors.intersection(prod_factors)) > 0:
    ss *= 1.5

return ss

我试图将其翻译为:


if odd length prod
    then ss = countConsonants cust
    else ss = countVowels cust
if  length (cust intersect prod) > 0
    then ss = 1.5 * ss
    else Nothing

return ss

但我不断收到错误:

  

输入`='

时解析错误

非常感谢任何有关此问题的帮助或言论。

6 个答案:

答案 0 :(得分:14)

不要认为Haskell中的编程是“如果这样,那么那样做,然后做另一件事” - 按顺序执行的整个想法是必不可少的。您没有检查条件然后定义变量 - 您只是计算取决于条件的结果。在函数式编程中,if是一个表达式,变量被赋值为表达式的结果,而不是在其中赋值。

最直接的翻译是:

let ss = if odd $ length prod
         then countConsonants cust
         else countVowels cust
in if length (cust `intersect` prod) > 0
   then Just $ 1.5 * ss
   else Nothing

答案 1 :(得分:6)

在Haskell中,if是一个表达式,而不是一个语句。这意味着它返回一个值(如函数)而不是执行操作。这是翻译代码的一种方法:

ss = if odd length prod 
    then countConsinants cust 
    else countVowels cust 
return if length ( cust intersect prod) > 0 
    then Just $ 1.5 * ss 
    else Nothing

这是另一种方式:

return if length ( cust intersect prod) > 0 
    then Just $ 1.5 * if odd length prod 
        then countConsinants cust 
        else countVowels cust 
    else Nothing

正如Matt指出的那样,你的Python代码不会返回None。每个代码路径都将ss设置为一个数字。如果这是它应该如何工作,这是一个Haskell翻译:

let ss = if odd $ length prod 
           then countConsonants cust 
           else countVowels cust 
in if length (cust `intersect` prod) > 0 
     then 1.5 * ss 
     else ss

答案 2 :(得分:3)

如果我是你,我会使用guards。也许我是哈斯克尔的异教徒。

ss prod prodfactors cust | even $ length prod = extratest . (1.5 *) . countvowels cust
                         | otherwise          = extratest . countconsonants cust
                         where extratest curval | custfactorsintersection prodfactors > 0 = curval * 1.5
                                                | otherwise                               = curval

答案 3 :(得分:2)

我会在Haskell中这样写:

if (not $ null $ cust_factors `intersect` prod_factors)
    then ss * 1.5
    else ss
where
    ss = if (even $ length prod)
         then 1.5 * count_vowels cust
         else count_cosinants cust

关于你写的内容的一些评论:

  • 您可以使用letwhere语法在Haskell中进行分配。通常,您在Haskell中编写的所有内容都是表达式。在您的情况下,您必须将整个事物编写为单个表达式,并使用letwhere简化该任务。
  • Haskell中的
  • return意味着与Python不同的东西,它用于带副作用的计算(如IO)。对于你的例子,没有必要。
  • NothingMaybe a类型的特殊值。此类型表示可能失败的a类型的值(Nothing)。

并回答你的直接问题。
这个Python代码

if b:
  s = 1
else:
  s = 2

将在s = if b then 1 else 2let子句中转换为Haskell where

答案 4 :(得分:1)

Functional programming与命令式编程不同。尝试逐行“翻译”并不是Haskell的使用方式。

答案 5 :(得分:1)

专门回答您的问题。 “ss”已经有了价值。它根本不可能赋予它不同的价值。 ss = ss * 1.5毫无意义。