gpt4 book ai didi

纯脚本行多态性。正确的语法是什么?

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

使用基于“Purescript by Example”第 5 章中示例的函数,我对如何声明多态行类型有点困惑。

以下编译正常

type Student = {
first :: String,
last :: String,
class :: String
}

type GymMember = {
first :: String,
last :: String,
benchPressPB :: Int
}

daveG :: GymMember
daveG = {
first: "Dave",
last: "Bro",
benchPressPB: 300
}

philS :: Student
philS = {
first : "Dave",
last : "Swat",
class : "1A"
}

schoolRollName :: forall t15.
{ last :: String
, first :: String
| t15
} -> String
schoolRollName rec = rec.last <> ", " <> rec.first

firstAndSurname :: forall t82.
{ first :: String
, last :: String
| t82
}
-> String
firstAndSurname rec = rec.first <> " " <> rec.last

daveFandS :: String
daveFandS = firstAndSurname daveG

daveSR :: String
daveSR = schoolRollName daveG

philFandS :: String
philFandS = firstAndSurname philS

philSR :: String
philSR = schoolRollName philS

但是如何删除 schoolRollName 和 firstAndSurname 类型签名中的重复项。

我认为下面的方法可行,但类型不匹配:

type NamedThing = forall t15.
{ last :: String
, first :: String
| t15
}

schoolRollName :: NamedThing -> String
schoolRollName rec = rec.last <> ", " <> rec.first

firstAndSurname :: NamedThing -> String
firstAndSurname rec = rec.first <> " " <> rec.last

-- !! Could not match type
daveFandS :: String
daveFandS = firstAndSurname daveG

最佳答案

NamedThing 未正确声明。要匹配 NamedThing 类型,您必须提供一个值,该值对 所有 至少有一个 first 的可能记录有效和最后 字段。由于 daveG 不是这样的值,编译器会提示 - 更进一步,这种类型没有值。

t 移动到类型别名:

type NamedThing t = {first :: String, last :: String | t}

现在 firstAndSurname 确实必须提供一个工作函数 forall NamedThings 以及任何额外的字段。简单的解决方案:

firstAndSurname :: forall t. NamedThing t -> String
firstAndSurname rec = rec.first <> " " <> rec.last

最后编译器对此感到满意:

daveFandS :: String
daveFandS = firstAndSurname daveG

关于纯脚本行多态性。正确的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069207/

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