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!