2014-12-12 5 views
1

В haskell можно сделать следующее.Обновление вложенных карт в scala

import Control.Lens 
import qualified Data.Map as M 
m :: Map Int (Map Int String) 
m = M.empty & at 1 . non M.empty . at 2 .~ Just "one-two" 

Возможно ли сделать что-то подобное в scala? Может быть, использовать скалаз? Я имею в виду обновление вложенной карты со значением по умолчанию.

Обновление: Хорошо, мы можем как минимум создать функцию обновления значения на карте без указания всех задействованных типов. Имею функцию как это.

// modifyMap :: (k, v) -> (v -> v) -> Map k v -> Map k v 
def modifyMap[K,V](k: K, v: V)(f: V => V)(m: Map[K,V]): Map[K,V] = { 
    m + (k -> f(m.getOrElse(k, v))) 
} 

И я хотел бы иметь возможность составлять эту функцию в том, что кажется разумным способом.

// (modifyMap (1, M.empty) . modifyMap (2, "")) (const "one-two") M.empty 
(modifyMap(1, Map.empty) compose modifyMap(2, ""))(_ => "one-two")(Map.empty) 

Это в основном то же, что и пример haskell, но тип просто не будет получен, если вы не будете полностью указаны.

+1

да, http://eed3si9n.com/learning- scalaz/Lens.html – Peter

ответ

-1

Посмотрите на Shaplesslenses или на скалясе, поскольку @Peter прокомментировал.

+1

Это почти ответ на ссылку. Некоторые описания или примеры сделают это лучше. Ссылка на комментарий не полезна, так как комментарии не должны отвечать на вопросы, и их можно было удалить в любое время. Если вы считаете, что это полезно, доведите эту информацию до вашего ответа – Daenyth

2

вы можете получить что-то подобное с Monocle:

import monocle.syntax._ // to use optics as infix operator, it is required to guide type inference 
import monocle.function._ // to get generic optics like at, index etc 
import monocle.std.map._ // to get Map instances of At, Index 

(Map.empty[Int, Map[Int, String]] applyOptional index(1) composeLens at(2)).set(Some("one-two")) 

// if you prefer there are some symbolic aliases 

(Map.empty[Int, Map[Int, String]] &|-> index(1) ^|-> at(2)).set(Some("one-two")) 

я не смог проверить его, пожалуйста, скажите мне, если он не компилируется