몇 가지 경우에의 변환을 실행 :다형성 구조를 순회 만한다고 가정 우리는 다음과 같은 방법으로 회사의 계층 구조를 나타냅니다
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Generics.Aliases
import Data.Generics.Schemes
data CompanyAsset = Employee Name Salary
| Plant Name
| Boss Name Performance Salary [CompanyAsset]
| Pet Name
| Car Id
| Guild [CompanyAsset]
| Fork CompanyAsset CompanyAsset
-- ... and imagine 100 more options that recursively use `CompanyAsset`.
deriving (Show, Data)
-- Performance of the department.
data Performance = Good | Bad deriving (Show, Data)
type Name = String
type Id = Int
newtype Salary = Salary Double deriving (Show, Data, Typeable)
raise :: Salary -> Salary
그리고 난 몰라 회사 자산의 급여를 제기하는 기능을 defne 싶습니다 해당 부서의 실적이 Bad
인 Boss
조상을 보유하고 있습니다. 다음과 같은 기능을 쉽게 정의 할 수 있습니다 :
raiseSalaries :: CompanyAsset -> CompanyAsset
raiseSalaries (Boss n Good s as) = Boss n Good (raise s) (raiseSalaries <$> as)
raiseSalaries [email protected](Boss _ Bad _ _) = a -- The salaries of everything below are not raised if the performance is 'Bad'
raiseSalaries ... -- and from here onwards we have **boilerplate**!
문제는이 상용구를 많이 필요로한다는 것이다 (토론을 위해서가의 CompanyAsset
이 주어 변경 될 수 있다고 가정하십시오).
제 질문은 위의 상용구를 피할 수있는 방식으로 데이터 구조를 탐색하는 방법이 있는지 여부입니다.
이 질문은 내가 게시 한 similar one과 관련이 있지만, everywhere'
의 사용은 급여를 인상해서는 안되기 때문에 도움이되지 않습니다.