使用参数中的计算在Haskell中定义函数

时间:2015-06-13 23:51:00

标签: haskell

如何在Haskell中定义一个函数,如下所示:

x(0)     = 1
x(2*k)   = sin(k) * cos(k)
x(2*k+1) = cos(k/2) - tan(2*k)

Haskell不允许在其参数中定义带有计算的函数。它会引发“模式中的解析错误”错误。

如果我尝试用x(k)来定义所有内容,就像这样:

x(k) = sin(k/2) * cos(k/2)
x(k) = cos((k/2-1)/2) - tan(k/2-1)

我将x(k)有两个定义,无效。

1 个答案:

答案 0 :(得分:4)

您可以按如下方式定义:

f 0 = 1
f i | even i = sin(k) * cos(k)
    | otherwise = cos(k/2) - tan(2*k)
    where k = fromIntegral $ div i 2

我将x替换为f因为x看起来更像是变量而不是函数。此外,我使用i作为传入参数。

div i 2表示您将i除以2(并将结果置于最低点),以便0映射到01 021。然后,可以使用fromIntegral将其转换为Floating;否则你不能拿sin等等。

现在有两种情况(f 0案例除外):i even2*k)和i oddotherwise(在这种情况下是sin(k) * cos(k))。您可以使用guards。对于偶数情况,我们现在使用cos(k/2)-tan(2*k)和另一个k/2。请注意,对于i我们使用浮点数,因此如果7k,则3将为cos(1.5)-tan(6),您将计算{{1} }}