如何在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)
有两个定义,无效。
答案 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
映射到0
,1
0
和2
到1
。然后,可以使用fromIntegral
将其转换为Floating
;否则你不能拿sin
等等。
现在有两种情况(f 0
案例除外):i
even
(2*k
)和i
odd
是otherwise
(在这种情况下是sin(k) * cos(k)
)。您可以使用guards。对于偶数情况,我们现在使用cos(k/2)-tan(2*k)
和另一个k/2
。请注意,对于i
我们使用浮点数,因此如果7
为k
,则3
将为cos(1.5)-tan(6)
,您将计算{{1} }}