Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Bool类的Num?_Haskell - Fatal编程技术网

Haskell Bool类的Num?

Haskell Bool类的Num?,haskell,Haskell,我有自己的类型: data MyType = ... 现在,我想在if中使用这种类型的值。有可能实施吗?当然,此时我得到了一个错误: Couldn't match expected type ‘Bool’ with actual type ‘MyType’ 的标准语义if/then/else特定于Bool。使用GHC,可以使用扩展更改标准语义。从文件中引用: …-XRebindableSyntax标志导致以下内置语法片段引用范围内的任何内容,而不是Prelude版本: 条件句(例如,如果

我有自己的类型:

data MyType = ...
现在,我想在
if
中使用这种类型的值。有可能实施吗?当然,此时我得到了一个错误:

 Couldn't match expected type ‘Bool’ with actual type ‘MyType’

的标准语义if
/
then
/
else
特定于
Bool
。使用GHC,可以使用扩展更改标准语义。从文件中引用:

-XRebindableSyntax
标志导致以下内置语法片段引用范围内的任何内容,而不是
Prelude
版本:

  • 条件句(例如,
    如果e1那么e2-else-e3
    )表示
    如果else-e1-e2-e3
    。但是,
    case
    表达式不受影响
这是我对问题的技术性回答


然而,我固执的回答是,你不应该这样做。相反,编写一个类型为
MyType->Bool
的谓词;然后使用
如果谓词myValue,则。。。否则…
。在我看来,这种明确的方式更为清晰和惯用;另一个好处是更灵活,因为您可以有许多不同类型的谓词,而不是将任何一个谓词提升到特殊的状态。

您可能可以使用
-XRebindableSyntax
(尽管您应该听Daniel Wagner的,不要这样做):

然后在GHCi中:

> :l decidable.hs
> :set -XRebindableSyntax
> P.putStrLn (if A then "it worked!" else "it failed!")
it worked!
再说一次,不要这样做!只需使用一个简单的函数,就可以省去很多麻烦,而且不会让阅读代码的其他人感到困惑,因为他们没有意识到您已经改变了语言的语法工作方式

> :l decidable.hs
> :set -XRebindableSyntax
> P.putStrLn (if A then "it worked!" else "it failed!")
it worked!