gpt4 book ai didi

haskell - 类似的 Haskell 列表推导式具有不同的结果

转载 作者:行者123 更新时间:2023-12-02 18:39:49 24 4
gpt4 key购买 nike

我不明白为什么这两个相似的列表理解会给出不同的结果:

Prelude> let t2s n= [ 1/(2*i) | i <- [1,3..n]]
Prelude> t2s 0
[0.5]
Prelude> let t2s n= [ (2*i) | i <- [1,3..n]]
Prelude> t2s 0
[]

我希望两者都在参数 0 上返回 []。我一定错过了一些愚蠢的东西?!

最佳答案

首先,我将您的第一个 t2s 的名称更改为 t1s,这样我就可以将它们同时加载到 ghci 中。查看每个类型的推断类型:

[ts.hs:2:1-33] *Main> :t t1s
t1s :: (Enum t, Fractional t) => t -> [t]
[ts.hs:2:1-33] *Main> :t t2s
t2s :: (Enum t, Num t) => t -> [t]
[ts.hs:2:1-33] *Main>

请注意,t1s 采用 Fractional 参数,而 t2s 采用 Num 参数。这意味着在 t1s 0 中,0 被推断为 Double。另一方面,解释器将 0 推断为 t2s 0 中的 Integer。由于参数使用的类型不同,因此行为可能会以非常令人惊讶的方式有所不同。特别是,您应该确保在枚举列表时仅使用 Integral 类型,如 [1,3..n] 中所示。

要解决此问题,您只需为这两个函数提供显式类型签名即可。

关于haskell - 类似的 Haskell 列表推导式具有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com