2017-09-24 1 views
2

목록이 있다고 가정하면 [A]입니다. 일부 술어를 만족하면 목록의 특정 요소를 업데이트하려고합니다. 그러나 그런 요소가 없다면 먼저 목록에 요소를 추가하고 싶습니다. 내 현재 솔루션은 거기에없는 경우 목록에 요소를 삽입하기위한 수동 함수를 작성한 다음 filtered 통과를 사용하여 요소를 업데이트합니다. 이와 같이 :'렌즈'가없는 경우 목록에 요소를 추가하는 방법은 무엇입니까?

더 나은 (더 짧고 관용적 인) 솔루션이 있는지 궁금합니다. 가능한 경우에만 microlens 패키지 패밀리를 사용하는 솔루션을 감사하겠습니다.

+0

@chepner 매우 가까이 있지만 정확하게는 아닙니다. 보시다시피 목록을 사용하고 있으므로 효율이 최우선 순위가 아닙니다. 내 솔루션은 이미 충분히 효율적이라고 생각할 수도 있지만 목록을 한 번만 통과하는 것으로 간주 할 수도 있습니다. 나는 짧은 양식 (효율성의 큰 손실없이)을 원한다. 그리고 저는 렌즈를 사용하는 솔루션에 관심이 있습니다 (렌즈가 없기 때문에 스스로 할 수 있습니다). 차이점은 양식에서'myUpdate'는 요소를 수정할지 여부를 확인해야합니다. 내 양식에서'map myUpdate'는 목록의 모든 요소를 ​​변경합니다. 그러나 당신의 생각은 내가 원하는 것에 매우 가깝습니다. – Shersh

+0

오, 죄송합니다. 나는 당신이 정말로 원했던 것을 알아 냈고, 내 코멘트를 삭제하는 것을 잊었습니다. – chepner

답변

0

당신은 그것을 조금 단축 has을 사용할 수 있어야합니다 : 당신이 정말로 그것을 단축하고 싶다면

functionIWantToWrite :: [A] -> [A] 
functionIWantToWrite = modifyItem . addEmptyItem 
    where 
    _items = filtered myPredicate 
    addEmptyItem list | has _items list = list 
         | otherwise  = item : list 
    modifyItem = each . _items %~ myUpdate 

을, 당신은 단지 Monoid m => Applicative (m,) 인스턴스를 사용하여 하나의 통과로 얻을 수 있습니다 또는 이와 비슷합니다.

관련 문제