我正在尝试将一些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
但我不断收到错误:
输入`='
时解析错误
非常感谢任何有关此问题的帮助或言论。
答案 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
关于你写的内容的一些评论:
let
和where
语法在Haskell中进行分配。通常,您在Haskell中编写的所有内容都是表达式。在您的情况下,您必须将整个事物编写为单个表达式,并使用let
或where
简化该任务。return
意味着与Python不同的东西,它用于带副作用的计算(如IO)。对于你的例子,没有必要。Nothing
是Maybe a
类型的特殊值。此类型表示可能失败的a
类型的值(Nothing
)。并回答你的直接问题。
这个Python代码
if b:
s = 1
else:
s = 2
将在s = if b then 1 else 2
或let
子句中转换为Haskell where
。
答案 4 :(得分:1)
Functional programming与命令式编程不同。尝试逐行“翻译”并不是Haskell的使用方式。
答案 5 :(得分:1)
专门回答您的问题。 “ss”已经有了价值。它根本不可能赋予它不同的价值。 ss = ss * 1.5
毫无意义。