2016-04-27 59 views
2

如何检查haskell中true和false操作之间的第二个参数?例如,False && True将只检查第一个参数,然后停止操作。在Haskell中是否有类似False & True来检查两个参数?Operator&in haskell?

+2

你为什么要这样做? –

+1

我们在谈论泛型Haskell还是GHC?你可以使用[bang模式](https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/bang-patterns.html)。 –

+0

我需要这个,因为我正在使用报告,并在函数中第二个参数是从来没有使用,因为这一点。 –

回答

6

在前奏&&被实现为

(&&) :: Bool -> Bool -> Bool 
True && x = x 
False && _ = False 

,所述第一参数是False第二 一个不会求的情况下这意味着。你总是可以实现自己的版本,有你想例如为:

(.&&.) :: Bool -> Bool -> Bool 
True .&&. x = x 
False .&&. False = False  
False .&&. True = False 

在其第二个第二个参数在两种情况下进行评估的行为。

+3

聪明的编译器会不会推导出第二个参数只能是“True”或“False”并因此优化它呢? –

+10

@WillemVanOnsem不,因为第二个参数也可以是'undefined'。这个定义意味着“False。&&”的语义。 undefined = undefined',而原始意味着'False && undefined = False'。编译器不允许改变它。 – luqui

4

没有很好的理由,为什么你会想,但如果你坚持......

import Control.Parallel (pseq) 

(&&!) :: Bool -> Bool -> Bool 
a &&! b = b `pseq` (a&&b) 

通常,seq(不需要任何进口)也就够了,而不是pseq,但只有后者确实保证b将被评估。

当然,这个函数的语义与单独的&&完全一样,在某些情况下它会慢一些。

+0

不'seq'也强制评估?我认为不同之处在于在返回之前'seq'力评估,在评估第二个词之前'pseq'强制评估。 – PyRulez

+0

你可能是对的。我通常认为''b'seq'a''只是保证运行时不会像'非WHNF thunk'一样离开'b',对它做什么没有任何可靠的影响......但除非' b''可以完全被优化,这可能确保它在结果给出之前被WHNF'd。 – leftaroundabout

+0

从技术上来说,'''''''''''a'只是意味着'b'' seq''a'如果'b'是一个无限循环。一个可能的优化是'b \'seq \'a = a \'seq \'(b \'seq \'a)',因为它仍然满足那个属性。 – PyRulez