2014-01-15 4 views
0

"failable"데이터 형식에서 값을 쉽게 가져 오거나 실패 할 경우 기본값을 사용하고 싶습니다. myMap에서"기본값 적용"추상 형식

infixr 1 <||> 
(<||>) :: Maybe a -> a -> a 
(<||>) = flip fromMaybe 

pred :: String -> String -> Bool 
pred x name = (x ==) <$> name `lookup` myMap <||> False 

pred 반환 x-Truename 경우지도 :

여기 Maybe 내 구현입니다.

그러나 일반적으로 하스켈의 경우처럼 내가 모르고있는 더 추상적 인 방법이 있습니다. 누군가? 당신이 마지막에 기본와 함께, Alternative와 결합

class Defaultable f where 
    infixr 1 <||> 
    (<||>) :: f a -> a -> a 

instance Defaultable Maybe where 
    (<||>) = flip fromMaybe 

instance Defaultable (Either a) where 
    (Left _) <||> x = x 
    (Right x) <||> _ = x 

가능한 선택을 문자열 수 있습니다

+0

는'어쩌면 거짓 (X ==) $ 조회 이름이 – augustss

+0

예, 저도 그 생각 myMap',하지만 난 더 추상성을 찾고 있어요 : 그 동안 당신은 스스로를 정의 할 수 있습니다. –

+1

문제는 펑터가 일반적인 경우 랩핑 된 값을 추출하지 못하게하기 때문에'fromMaybe '를 추상화하는 방법이 실제로 없다는 것입니다. 당신은 항상'Maybe' 함수가 필요할 것입니다. 이것은'fromMaybe','fromJust' 또는 당신이 그것을 쓰는 방법에 따라'maybe' 일 수 있습니다. – Tarmil

답변

4

Foldable 아마 표준 라이브러리에서 합리적인 선택입니다. 또한 coming in GHC 7.8/base 4.7이지만 불행히도 Either 인스턴스가 없습니다.

instance Foldable (Either a) where 
    foldMap _ (Left _) = mempty 
    foldMap f (Right y) = f y 

    foldr _ z (Left _) = z 
    foldr f z (Right y) = f y z 
+0

그 이유가없는 이유는 무엇입니까? –

+2

나는 그걸 연구하고 있었어. 본질적으로 그것이 보류 중이라고 생각합니다 : http://www.haskell.org/pipermail/libraries/2012-July/018248.html, 그러나 착륙했는지 아직 확실하지 않습니다. –

0

는 여기에 내가 무엇을 최대 온입니다.

import Data.Foldable 

infixr 1 <||> 
(<||>) :: Foldable f => f a -> a -> a 

v <||> a = 
    case toList v of 
     [] -> a 
     (x:xs) -> x 

그것은 당신이 볼 수있는 "최초의"요소 또는하지만 "마지막"하나를 수행할지 여부를 결정해야 의미 하는가 :