2016-12-09 11 views
1

"Purescript by Example" 5章の例に基づいて演奏していますが、多型の行タイプを宣言する方法については少し悩まされています。Purescript行の多型。正しい構文は何ですか?

以下は

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 

答えて

3

NamedThingが正しく宣言されていません。タイプNamedThingを一致させるにはあなたは、少なくとも最初最後フィールドで FORALL可能レコードを作業した値を提供する必要があります。 daveGはこのような値ではないので、コンパイラは苦情を申し立てます。さらに、そのような型の値はありません。

はタイプエイリアスに トンを移動

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

今すぐ firstAndSurnameNamedThings余分なフィールドを持つ FORALLワーキング機能 を提供する必要がありません。簡単な解決策:

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

最後に、コンパイラはそれで満足している:

daveFandS :: String 
daveFandS = firstAndSurname daveG 
関連する問題