gpt4 book ai didi

haskell - 应用参数可以是 Ints 或 Doubles 的函数

转载 作者:行者123 更新时间:2023-12-04 14:47:18 25 4
gpt4 key购买 nike

我对 Haskell 很陌生,所以我希望这不是一个愚蠢的问题。我有这个数据类型:

data N = I Int | D Double deriving (Show, Eq)

我正在尝试使用签名 (Num a) => (a -> a -> a) -> N -> N -> N 编写函数它将函数应用于 N 中的数字s 并返回 N 和结果。如果 N s 都是 D s,它应该只应用函数并返回 D ;如果一个是 I另一个是 D ,它应该转换 IntIDouble ,将函数应用于两个 Double s,并返回 D ;如果两者都是 I s,它应该应用函数并返回 I .这是我到目前为止的(损坏的)代码:
widen :: N -> N -> (N, N)
widen (I i) d@(D _) = (D (fromIntegral i), d)
widen d@(D _) i@(I _) = widen i d
widen x y = (x, y)

numOp :: (Num a) => (a -> a -> a) -> N -> N -> N
numOp op x y = case widen x y of (D x', D y') -> D $ x' `op` y'
(I x', I y') -> I $ x' `op` y'

我在 numOp 的两行都收到错误消息, 尽管。第一个是:
Could not deduce (a ~ Double)
from the context (Num a)
bound by the type signature for
numOp :: Num a => (a -> a -> a) -> N -> N -> N
at <line num>
In the second argument of `($)', namely x' `op` y'
In the expression: D $ x' `op` y'
In a case alternative: (D x', D y') -> D $ x' `op` y'

第二个:
Couldn't match type `Double' with `Int'
Expected type: Int
Actual type: a
In the second argument of `($), namely x' `op` y'
In the expression: I $ x' `op` y'
In a case alternative: (I x', I y') -> I $ x' `op` y'

我很确定我理解这两个错误的含义;我认为第一个是说我的类型签名中的信息不足以让 GHC 假设 op返回 Double ,这是 D 所要求的value 构造函数,第二个是说,因为第一行暗示 aDouble ,此行不能使用 a 类型的值好像是 Int .不过,我不知道从哪里开始寻找正确的方法。

如果它有帮助,我试图让它工作的原因是我正在关注 Write Yourself a Scheme tutorial ;本教程中的所有示例(特别是在 Evaluation section 中)仅处理整数,但作为练习,我想添加支持整数和浮点数的功能,例如 (+ 1 2.5 2.5)返回 6.0(+ 1 2 3)返回 6 .如果我认为这是错误的方式或者有更简单的方法来完成它,我很想听听建议。

最佳答案

签名

numOp :: (Num a) => (a -> a -> a) -> N -> N -> N

numOp采用 a -> a -> a 类型的任何单态函数对于 Num 的每个特定实例和两个 N s 并从中计算出 N .例如,一个类型的函数
Complex Float -> Complex Float -> Complex Float

或者
approxRational :: RealFrac a => a -> a -> Rational

(专门用于 a = Rational )将是合法的第一个参数。

你需要的是一个可以处理所有 Num的多态函数实例作为第一个参数,即等级 2 类型
numOp :: (forall a. Num a => a -> a -> a) -> N -> N -> N

(您需要 RankNTypes 语言扩展名)。

关于haskell - 应用参数可以是 Ints 或 Doubles 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096424/

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