如何检查haskell中true和false操作之间的第二个参数?例如,False && True
将只检查第一个参数,然后停止操作。在Haskell中是否有类似False & True
来检查两个参数?Operator&in haskell?
回答
在前奏&&
被实现为
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
,所述第一参数是False
第二 一个不会求的情况下这意味着。你总是可以实现自己的版本,有你想例如为:
(.&&.) :: Bool -> Bool -> Bool
True .&&. x = x
False .&&. False = False
False .&&. True = False
在其第二个第二个参数在两种情况下进行评估的行为。
聪明的编译器会不会推导出第二个参数只能是“True”或“False”并因此优化它呢? –
@WillemVanOnsem不,因为第二个参数也可以是'undefined'。这个定义意味着“False。&&”的语义。 undefined = undefined',而原始意味着'False && undefined = False'。编译器不允许改变它。 – luqui
没有很好的理由,为什么你会想,但如果你坚持......
import Control.Parallel (pseq)
(&&!) :: Bool -> Bool -> Bool
a &&! b = b `pseq` (a&&b)
通常,seq
(不需要任何进口)也就够了,而不是pseq
,但只有后者确实保证b
将被评估。
当然,这个函数的语义与单独的&&
完全一样,在某些情况下它会慢一些。
不'seq'也强制评估?我认为不同之处在于在返回之前'seq'力评估,在评估第二个词之前'pseq'强制评估。 – PyRulez
你可能是对的。我通常认为''b'seq'a''只是保证运行时不会像'非WHNF thunk'一样离开'b',对它做什么没有任何可靠的影响......但除非' b''可以完全被优化,这可能确保它在结果给出之前被WHNF'd。 – leftaroundabout
从技术上来说,'''''''''''a'只是意味着'b'' seq''a'如果'b'是一个无限循环。一个可能的优化是'b \'seq \'a = a \'seq \'(b \'seq \'a)',因为它仍然满足那个属性。 – PyRulez
- 1. in operator in C#
- 2. Mongo $ in operator performance
- 3. Linq IN Operator
- 4. * -Operator in gas
- 5. the:not operator in jquery
- 6. SQL:使用with-clause in“not in”-operator
- 7. vb.net preincrement operator in function arg
- 8. wherePivot laravel method and“in”operator
- 9. 如何重载operator in?
- 10. << operator not working in C++
- 11. Haskell - Let in expression
- 12. PutText in haskell HUnit
- 13. mod,div in Haskell
- 14. Int32 to Int in Haskell
- 15. operator = in C++(11)工作方向
- 16. With in Laravel and Validate double - > operator
- 17. 'operator ='in'((library *)this) - > library :: database [bookcode] = -1'|
- 18. Datediff in Criteria operator in spring-data-mongodb does not working
- 19. operator +()和operator + =()
- 20. Prolog - > operator-operator expected
- 21. 重载operator-,operator <和operator>
- 22. operator || =
- 23. 使用SQL中的复选框值“IN”--operator
- 24. MySQL in-operator必须匹配所有值吗?
- 25. 如何使用In Operator获取详细信息
- 26. operator << in template class;与命名空间;
- 27. 'std :: operator <<'operator <<'不匹配'std :: operator <<
- 28. groovy^operator
- 29. C#'+ ='Operator
- 30. ruby operator“=〜”
你为什么要这样做? –
我们在谈论泛型Haskell还是GHC?你可以使用[bang模式](https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/bang-patterns.html)。 –
我需要这个,因为我正在使用报告,并在函数中第二个参数是从来没有使用,因为这一点。 –