【问题标题】:Purescript row polymorphism. What is the correct syntax?Purescript 行多态性。什么是正确的语法?
【发布时间】:2016-12-10 07:05:29
【问题描述】:

使用基于“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

【问题讨论】:

    标签: purescript


    【解决方案1】:

    NamedThing 未正确声明。要匹配 NamedThing 类型,您必须提供一个值,该值可以在 forall 可能的记录中至少有一个 firstlast 字段。由于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2017-06-16
      • 2014-04-19
      • 2018-11-14
      • 2019-09-07
      相关资源
      最近更新 更多