2016-12-09 2 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 올바르게 선언되지 않은 :

는 내가 일하는 것이 다음하지만 종류가 일치하지 않는 생각. 당신은 적어도 마지막 필드 FORALL 가능한 기록을 작동 않는 값을 제공해야 유형을 NamedThing 일치합니다. daveG은 그런 값이 아니기 때문에 컴파일러는 불평합니다. 그런 유형의 값도 없습니다.

는 타입 별칭에 이동

:

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

지금 firstAndSurname
NamedThings 여분의 필드 FORALL 작업 기능 를 제공 할 필요가 없습니다. 간단한 해결책 :

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

마지막으로 컴파일러는 그와 함께 행복 :

daveFandS :: String 
daveFandS = firstAndSurname daveG