2015-04-24 13 views

Odpowiedz

16

Haskella if wykonuje dokładnie tak, jak chcesz.

if x == y then a else b 

Jak wspomniano Lee, istnieje bool funkcja w Data.Bool że robi to samo. Również dzięki lazyness Haskell, w bool someLongComputation something True nie działa długiej obliczeń ..

+0

Oczywiście, ale zauważ, że 'if'-' then' -elel' jest wbudowanym konstruktorem języka, a nie operatorem. Na przykład nie ma sensu pytać o typ "jeśli". – Jubobs

+0

Tak, ale ... funkcje zdefiniowane przez użytkownika ... 'ifelse p a b = jeśli p to a else b'. Lub tupling jak w R 'ifelse (p, a, b) = jeśli p to a else b'. –

+2

@Jubobs '?:' W C++ to również wbudowana konstrukcja języka. – sepp2k

10

Istnieje funkcja bool w Data.Bool:

import Data.Bool 
bool b a (x == y) 
+0

czy istnieje powód, aby użyć tego w stosunku do "jeśli jeszcze inaczej" poza zwięzłością? czy w przypadku narożnych przypadków występuje różnica w wydajności lub różnica w wydajności? – daj

+0

@daj Na podstawie [jego definicji] (http://hackage.haskell.org/package/base-4.8.0.0/docs/src/Data-Bool.html#bool), 'bool' nie powinien być związany z wszelkie wygórowane koszty ogólne. – Jubobs

+7

@daj: Jedynym powodem użycia 'bool' byłoby przekazanie niedostatecznie wypełnionego formularza do funkcji wyższego rzędu, np.' Map (bool b a) xs'. –

15

Oprócz if lub Data.Bool.bool, które rzeczywiście tylko to, co chcesz, może również zdefiniować takiego operatora w Haskell!

infixr 1 ? 
(?) :: Bool -> a -> a -> a 
(True ? a) _ = a 
(False ? _) b = b 

GHCi> 3 == 2? "equal" $ "nonequal"
"nonequal"
GHCi> 3 == 3? "równy" $ "nonequal"
"równy"

+1

Podoba mi się ta definicja '?', 'C? (t, e) = jeśli c to t innego e'. – augustss

+3

Niezłe nadużycie '$' i pierwszeństwo. – chi

Powiązane problemy