2015-07-27 20 views
5

mam następujący prosty kodCo to jest właściwy sposób obsługi (głęboko zagnieżdżonych) funktorów?

import Data.String.Regex 
import Data.Array 

last <$> match someRegex " 1" 

gdzie

match someRegex " 1" 

powraca coś

Just ([Just (" 1"),Just (" "),Just ("1")]) 

i

last <$> match someRegex " 1" 

zwrotów coś lik e

Just (Just (Just (" 1"))) 

Teraz mam głęboko zagnieżdżoną Może. Co sprawia, że ​​ciężko z nim pracować (nawet używając funktorów). Napisałem sobie parę funkcji pomocniczych - ale jestem z tego powodu niezadowolony. To jakoś nie jest w porządku.

extract j = do 
    case j of 
     Nothing -> Nothing 
     Just a -> a 
extract2 jj = extract $ extract jj 

a następnie użycie go jak ten

extract2 $ last <$> match someRegex " 1" 

Czy istnieje lepszy/idiomatyczne sposób robić takie rzeczy w Purescript/Haskell?

+2

Jeśli nie chcesz się jeszcze łączyć, ale chcesz to zmienić, pamiętaj, że fmap można składać: 'fmap. fmap :: (Funktor f, Funktor g) => (a -> b) -> f (g a) -> f (g b) ',' fmap. fmap. fmap :: (Funktor f, Funktor g, Funktor h) => (a -> b) -> f (g (ha)) -> f (g (hb)) ' – Cubic

+0

hmm moje pytanie było bardziej, jeśli jest sposób na uniknięcie tego zagnieżdżenia na początku – robkuz

+1

Z 'Maybe' jest mało interesujących informacji zakodowanych w wielu warstwach, ale może nie być tak w przypadku innych funktorów (np. możesz użyć' fmap .fmap. fmap' aby odwzorować podwójnie zagnieżdżoną listą przy zachowaniu całej jej struktury). – duplode

Odpowiedz

9

Może szukasz funkcji join:

http://pursuit.purescript.org/packages/purescript-control/0.3.0/docs/Control.Bind#d:join

join wali dwóch warstw struktury w dół do pojedynczej warstwy, łącząc żadnych efektów. W przypadku Maybe oznacza to, że wynikowa wartość nie będzie Nothing, tylko jeśli obie warstwy nie są Nothing.

+0

, więc w zasadzie mówisz, że moja funkcja 'extract' jest jakimś wariantem' join' i to jest sposób w jaki traktowane są rzeczy? duh! Czy nie ma sposobu (pojęciowo), aby w ogóle uniknąć tego głębokiego zagnieżdżania się? – robkuz

+3

Jednym ze sposobów jest zauważenie, że 'join (mapa fx)' jest takie samo jak 'x >> = f' według praw' Monad', więc możesz powiedzieć 'dopasuj someRegex" 1 ">> = last' i zapisz się a 'join'. –

+0

'match' zwraca dwie warstwy' Maybe' z powodu wielu sposobów, w których wersja JS może zawieść, więc przynajmniej jedno 'join' jest konieczne, jeśli zależy ci na tym, aby wszystko się powiodło. –

Powiązane problemy