gpt4 book ai didi

haskell - 类型推导在 Haskell 中是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 03:31:15 25 4
gpt4 key购买 nike

我试图通过学习 Haskell 来拓宽我的思维。

我自己做的作业是构建一个时钟滴答发生器,它会给我泊松分布的间隔,最终结果(经过长时间的斗争,我承认)是这样的:

import System.Random
poissonStream :: ( Ord r, Random r, Floating r, RandomGen g) => r -> r -> r -> g -> [r]
poissonStream rate start limit gen
| next > limit = []
| otherwise = next:(poissonStream rate next limit newGen)
where (rvalue, newGen) = random gen
next = start - log(rvalue) / rate

但是有两件事(至少)我不明白:

为什么我需要“ Ord r”以及“ Floating r”? (我本来期望某种自动继承:“Floating”意味着“Ord”。)

隐含的类型定义“ rvalue :: Float”是通过什么路径实现的?
在 GHCi 中,我得到了我所期望的:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100)
<interactive>:1:23:
Ambiguous type variable `t' in the constraint:
`Random t' arising from a use of `random' at <interactive>:1:23-43
Probable fix: add a type signature that fixes these type variable(s)

rvalue 是一门松散的大炮,我必须系好:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100) :: (Float, StdGen)
*Main System.Random> rvalue
0.18520793

请对 Haskell n00b 温柔一点。

最佳答案

Why do I need "Ord r" as well as "Floating r"? (I would have expected some kind of automatic inheritance: "Floating" implies "Ord".)


Floating应该对所有浮点数进行分类,包括复数。复数没有排序。您可以使用 RealFloat而不是 Floating ,这意味着 Ord .

By what path is the implied type definition "rvalue :: Float" achieved?



好吧,您可以从 rvalue 的上下文中推断出这一点。用来。这是 log 的参数, 和
:t log


log :: (Floating a) => a -> a

所以 rvalue必须在 Floating类(因此它将是“ Floating 类型类中的某种类型,而不是精确的 Float )。此外, log 的结果与其输入的类型相同,并用于与 startrate 并与 limit 比较,它们都是 r 类型,所以 rvalue 将是 r(这是合适的,因为 r 也是 Floating)。

在您的 GHCi 示例中,没有更多上下文。类型
 :t random (mkStdGen 100)

这给你
random (mkStdGen 100) :: (Random a) => (a, StdGen)

GHCi 不知道要为 a 填写什么类型这里。它只知道它必须在 typeclass Random 中.

关于haskell - 类型推导在 Haskell 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1351721/

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