gpt4 book ai didi

haskell - 任何人都可以解释这个错误吗?无法匹配类型 `Integer'

转载 作者:行者123 更新时间:2023-12-02 21:25:30 24 4
gpt4 key购买 nike

我正在尝试学习 haskell,但有一个我无法弄清楚的特定错误。

robot (_name,_attack,_hp) = \ cmd -> cmd (_name,_attack,_hp)

hp (_,_,h) = h
getHp aRobot = aRobot hp

setHp aRobot newHp = aRobot (\ (n,a,_) -> robot (n,a,newHp))

damage aRobot amount = let actualHp = getHp aRobot
in
setHp aRobot (actualHp - amount)


makeKiller = robot ("Killer",10,200)
makeBetty = robot ("Betty",5,300)

----- Example of computation in ghci

b = makeBetty
b1 = damage b 34

<interactive>:52:14: error:
* Couldn't match type `Integer'
with `(([Char], Integer, t1) -> t0) -> t0'
Expected type: (([Char], Integer,
(([Char], Integer, t1) -> t0) -> t0)
-> (([Char], Integer, t1) -> t0) -> t0)
-> t1
Actual type: (([Char], Integer, Integer) -> t1) -> t1
* In the first argument of damage, namely `b'
In the expression: damage b 34
In an equation for `b1': b1 = damage b 34
* Relevant bindings include b1 :: t1 (bound at <interactive>:52:1)

损坏函数中有一些错误,有人可以向我解释一下这个错误吗?

提前谢谢您!

最佳答案

此代码需要 Rank2Types 扩展。

机器人贝蒂的类型为 ((String, Integer, Integer) -> t) -> t。该类型应该是多态类型。

函数损坏以Robot(其类型为(String, Integer, Integer) -> t) -> t)作为参数。该函数具有2级多态性。

{-# LANGUAGE Rank2Types #-}

type Robot = forall t . ((String, Integer, Integer) -> t) -> t

robot :: (String, Integer, Integer) -> Robot
robot (_name,_attack,_hp) = \ cmd -> cmd (_name,_attack,_hp)

hp :: (String, Integer, Integer) -> Integer
hp (_,_,h) = h

getHp :: Robot -> Integer
getHp aRobot = aRobot hp

setHp :: Robot -> Integer -> Robot
setHp aRobot newHp = aRobot (\ (n,a,_) -> robot (n,a,newHp))

damage :: Robot -> Integer -> Robot
damage aRobot amount = let actualHp = getHp aRobot
in
setHp aRobot (actualHp - amount)


makeKiller :: Robot
makeKiller = robot ("Killer",10,200)

makeBetty :: Robot
makeBetty = robot ("Betty",5,300)

如果没有2级类型,则getHp和setHp所需的机器人类型不匹配。函数 getHp 需要 ((String, Integer, Integer) -> Integer) -> Integer 作为 Robot 类型。函数 setHp 需要 ((String, Integer, Integer) -> Robot) -> Robot。

这里是简化版本。

fun :: (a -> a) -> Char -> Int -> (Char, Int)
fun f c n = (f c, f n)

这个定义会导致类型错误。

{-# LANGUAGE Rank2Types #-}

fun :: (forall a . a -> a) -> Char -> Int -> (Char, Int)
fun f c n = (f c, f n)

这个定义没问题!

关于haskell - 任何人都可以解释这个错误吗?无法匹配类型 `Integer',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715886/

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