2016-10-21 2 views
2

유형 시스템에서 다음을 쉽게 수행 할 수 있습니까? 유형 수준에서 기록의 모든 분야에 적용되는유형 수준의 레코드에있는 모든 필드에 함수 적용

그것은 기본적으로 용기의 일종이다
data Product = Product { 
    id :: ProductId 
    , name :: Text 
    , sku :: SKU, quantity :: Int 
    , description :: Maybe Text 
    } 

data Omittable a = Omit | Present a 
type ProductWithOmittableFields = Omittable Product 

-- ProductWithOmittableFields is now equivalent to:\ 
-- 
-- data ProductWithOmittableFields = ProductWithOmmitableFields { 
--  id :: Omittable ProductId 
-- ,name :: Omittable Text 
-- ,sku : : Omittable SKU 
-- ,quantity :: Omittable Int 
-- ,desciption :: Omittable (Maybe Text) 
-- } 

(펑?).

이 아이디어가 확장 가능한 레코드 라이브러리로 더 잘 표현되어 있습니까?

편집 사용 사례는 사용자가 변경 한 필드 집합을 나타내는 ProductWithOmittableFields을 UI 레이어에서 가져옵니다. 우리는 DB에서 Product을 얻을 것이다, 우리는 Product

+1

"이 아이디어는 확장 가능한 레코드 라이브러리로 더 잘 표현됩니까?" 거기에는 "generics-sop"이라는 라이브러리가 있습니다. 다음 질문을 참조하십시오. http://stackoverflow.com/questions/39020787/is-there-a-way-to-apply-maybe-constructor-to-each-field-of-record-with-generics and http :// /stackoverflow.com/questions/38248692/whats-a-better-way-of-managing-large-haskell-records – danidiaz

답변

4

의 새로운 값을 가능한 방법으로 얻을 수 병합됩니다

import Control.Functor.Identity 

data Product k = Product { 
    id :: k ProductId 
    , name :: k Text 
    , sku :: k SKU 
    , quantity :: k Int 
    , description :: k (Maybe Text) 
    } 

data Omittable a = Omit | Present a 
type ProductWithOmittableFields = Product Omittable 
type ProductWithRegularFields = Product Identity 

예 :

testOmit :: ProductWithOmittableFields 
testOmit = Product 
    { id = Present someProductId 
    , name = Omit 
    ... } 

testReg :: ProductWithRegularFields 
testReg = Product 
    { id = Identity someProductId 
    , name = Identity someText 
    ... } 

이 방법 만이있다을 일반적인 경우에 각 필드를 Identity으로 감싸는 사소한 불편 함.

+0

값 수준에서 '제품 ID'에서 'ProductWithRegularFields'를 가져 오는 가장 쉬운 방법은 무엇입니까? 실행 시간)? –

+0

@SaurabhNanda 당신은 아무것도 할 필요가 없습니다, 그들은 정확히 같은 유형입니다. 위에서 나는 새로운 타입의'data T = ... '를 선언하는 대신에 타입 동의어'type T ='를 사용했다. – chi

+0

나를 다시 말해 보겠습니다. 각 필드가 'Identity x'가 아닌 'Product'값을 얻는 방법? –

관련 문제