2011-08-27 8 views
7

So che posso solito solo pattern match, ma a volte avrei trovato queste funzioni utili:Posso chiedere un E se è Left (o Right)?

isLeft = either (const True) (const False) 
isRight = either (const False) (const True) 

C'è qualcosa di simile nella libreria standard?

+0

Penso che @ pyrospade dovrebbe essere la risposta accettata ora. – SwiftsNamesake

risposta

19

Mentre questo è piuttosto vecchio, postare qui per riferimento.

Questo è ora nella libreria standard sotto Data.Either dal 4,7:

https://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Either.html

isLeft :: Either a b -> Bool

Ritorna True se il valore dato è una sinistra-value, False altrimenti.

isRight :: Either a b -> Bool

Ritorna True se il valore dato è un diritto-valore, False altrimenti.

3

No, non c'è, afaik.

Ma si possono definire queste funzioni ancora più semplice *:

isLeft (Left _) = True 
isLeft _  = False 

lo stesso vale per isRight, naturalmente.

EDIT: * Va bene, credo che sia sostenibile se questo è più facile o no, in quanto richiede più righe di codice ...

5

No, ma è possibile scrivere:

import Data.Either 

isLeft = null . rights . return 
isRight = null . lefts . return 
+2

Probabilmente perché è un modo piuttosto non semplice di definire le funzioni. Una definizione in termini di "entrambi" o l'uso della corrispondenza dei modelli sarebbe probabilmente più comprensibile. –

+0

Potrebbe essere.Sono un po 'deluso di come siano disponibili poche funzioni per "Either", non c'è molto da lavorare. Mi aspetterei almeno qualcosa come 'leftMaybe :: O a b -> Forse a' e la sua controparte. – Landei

2

Per quanto riguarda Lo so, non c'è niente di simile nella libreria standard. Puoi definirlo facilmente, comunque.

either l _ (Left a) = l a 
either _ r (Right b) = r b 

isLeft (Left _) = True 
isLeft _  = False 

isRight (Right _) = True 
isRight _   = False 
+2

L'OP vuole sapere se 'isLeft' e' isRight' si trovano nella libreria standard con nomi diversi. Sa che può già definirli in termini di "entrambi", che * è * nella libreria standard. – dave4420

+3

Ho fatto +1 perché le risposte simili non hanno un -1. Anche lui ha risposto alla domanda. – alternative

13

Dato che le persone sono state sottolineando, non v'è alcuna funzione nella libreria standard, e si può implementare una propria in vari modi.

Tuttavia, si noti che le domande del modulo "X è nella libreria standard?" sono più facilmente risolti da Hoogle, poiché, anche se non si conosce il nome di una funzione, è possibile cercarlo con il suo tipo.

Hoogle è anche abbastanza intelligente da sapere che l'ordine degli argomenti non ha importanza e mostrerà anche risultati i cui tipi sono simili (ad esempio più generici) del tipo che hai cercato.

In questo caso, cercare Either a b -> Booldoes not yield any promising matches, quindi è un buon indicatore che non esiste nella libreria standard.

+1

Il consiglio per Hoogle è ancora buono, ma si noti che la libreria standard * fa * ha una funzione simile ora; vedi [l'altra risposta a questa domanda] (http://stackoverflow.com/a/24046158/1126841). – chepner

Problemi correlati