답으로 몇 가지 질문을 게시하는 것이 즐겁습니다. 스도쿠를 기초로 한 Applicative
과 Traversable
사이의 상호 작용에 관한 재미있는 이야기입니다.
(1)
data Triple a = Tr a a a
이
instance Applicative Triple
instance Traversable Triple
를 구축 고려 그래서 Applicative
인스턴스가 "벡터화"수행과 Traversable
인스턴스가 왼쪽에서 오른쪽으로 작동합니다. 적절한 Functor
인스턴스를 만드는 것을 잊지 마세요. Applicative
또는 Traversable
인스턴스에서 추출 할 수 있는지 확인하십시오. 당신은 찾을 수 있습니다
newtype I x = I {unI :: x}
후자에 유용합니다.
(2)
newtype (:.) f g x = Comp {comp :: f (g x)}
지금
instance (Applicative f, Applicative g) => Applicative (f :. g)
instance (Traversable f, Traversable g) => Traversable (f :. g)
우리가 수평 영역
,495 수직 영역으로서
Board
를 나타내는
type Zone = Triple :. Triple
가정하자 정의하는 것이 확인 고려
traverse
의 기능을 사용하여 수직 영역의 수평 영역으로, 사각형의 정사각형으로 재정렬하는 방법을 보여줍니다.
(3)
newtype Parse x = Parser {parse :: String -> [(x, String)]} deriving Monoid
또는 (| 어쩌면 | 부적절한의 라이브러리 Monoid
동작 것을주의) 일부 다른 적절한 구조를 생각해 보자.
instance Applicative Parse
instance Alternative Parse -- just follow the `Monoid`
를 구축하고 소모가 주어진 조건에 의해 허용되는 경우 문자를 제공
ch :: (Char -> Bool) -> Parse Char
구현합니다.
(4)
가
square :: Parse Int
사용 pure
및 traverse
구축 (0은 공백을 나타낸다) 한 다음에 숫자 공백의 모든 양을 소비하는 파서를 구현
board :: Parse (Board Int)
(5) 상수 펑터를 고려하십시오.
newtype K a x = K {unK :: a}
및 constru CT
instance Monoid a => Applicative (K a)
는
crush :: (Traversable f, Monoid b) => (a -> b) -> f a -> b
가 접속어와 논리합 모노 이드 구조를 표현
Bool
에 대한
newtype
래퍼를 구축 구현하는
traverse
를 사용합니다.
Traversable
펑터에서 작동하는
any
및
all
의 버전을 구현하려면
crush
을 사용하십시오.
(6) 번 이상 발생할 값 목록을 계산
duplicates :: (Traversable f, Eq a) => f a -> [a]
구현. (완전히 사소한하지 않습니다.) (이이 사용하는 차동 미적분을 할 수있는 멋진 방법입니다,하지만 그건 또 다른 이야기입니다.)
이
(7) 보드가 있는지 확인
complete :: Board Int -> Bool
ok :: Board Int -> Bool
를 구현 (1) 전체 단지 행, 열 또는 상자에 중복이없는 [1..9] 및 (2)의 자릿수
연습을 제안 할 수는 없지만 모나드가 아닌 응용 펑터를 볼 수는 있습니다. (중요한 질문은 "모나드보다 강력하지 않을 때 응용 펑터를 디자인하는 이유는 무엇입니까?"). 멀티 패러다임 적용 (Paterson과 McBride)은 하나이고 Doaitse Swierstra의 파서, Andy Gill과 Kevin Matledge의 칠판에 애니메이션 하나 _Active_가 있습니다. Andy Gill과 동료 Kansas Lava는 응용 펑터를 기반으로합니다. –