gpt4 book ai didi

Haskell 类型签名错误

转载 作者:行者123 更新时间:2023-12-02 16:27:42 25 4
gpt4 key购买 nike

我的功能不起作用。我尝试了许多不同的类型签名。如果我删除类型签名,它不适用于点编号“p”。

fak :: (Num a, Ord a) => a->a
fak x
| x <= 1 = 1
| otherwise = x*fak (x-1)

ncr :: Integral a => a -> a -> a
ncr n k = (fak n) `div` (fak(n-k) * fak k)

bTable :: (Integral a, Num b) => a->b->a->a
bTable n p k = (ncr n k) * p^k * (1-p)^(n-k)

推断类型不够通用

*** Expression    : bTable
*** Expected type : (Integral a, Num b) => a -> b -> a -> a
*** Inferred type : (Integral a, Num a) => a -> a -> a -> a

如果我删除类型签名,我会得到:

:t bTable
bTable :: Integral a => a -> a -> a -> a

但是如果我输入:

bTable 50 0.8 10

我明白

Unresolved overloading
*** Type : (Fractional a, Integral a) => a
*** Expression : bTable 50 0.8 10

最佳答案

使用 fromIntegralncr 的返回值转换为可以与 Num a => a 值相乘的值。

bTable n p k = fromIntegral (ncr n k) * p^k * (1-p)^(n-k)

请注意,该函数的推断类型为

bTable :: (Num a, Integral b) => b -> a -> b -> a

这与您尝试声明的类型略有不同(为了与上面的类型进行比较而重命名了约束)

bTable :: (Num a, Integral b) => b -> a -> b -> b 

关于Haskell 类型签名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608888/

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