

たびたび失礼します。  
haskellについての質問です。  
`&&`式で

[code]

    True && _ = _
    False && _ = False
    
[/code]

を条件式で表せ、という問題なのですが

[code]

    (bb) :: Bool -> a -> b
    x bb y = if x == True then y else x
    
[/code]

上記のプログラムでコンパイルしたところ以下のエラーがでました

[code]

    enzan.hs:1:1: error:
    Invalid type signature: (bb) :: ...
    Should be of form <variable> :: <type>
      |
    1 | (bb) :: Bool -> a -> b || Bool
      | ^^^^
    
[/code]

プログラムの何が間違っているのかよく分からないのですがご教授お願いします。


CC BY-SA 4.0
2018-05-09T09:17:32.567
43889
2018-05-10T05:32:29.373
2018-05-10T05:32:29.373
153
28467
question
haskell
bb という中置演算子が定義できない


`bb` を中置演算子のように使用していますが、中置演算子は記号でないといけません。

例えば、`.&&.` を定義するように改修するとエラーがなくなります。

[code]

    (.&&.) :: Bool -> Bool -> Bool
    x .&&. y = if x then y else x
    
[/code]


CC BY-SA 4.0
2018-05-09T09:31:49.237
43890
2018-05-10T03:13:13.000
2018-05-10T03:13:13.000
153
153
43889
answer


コメントの方の疑問への回答です．

件のエラーメッセージは，

> 型bを期待したが実際はBoolであったので照合できませんでした．  
>  bは型シグネチャ (.&&.) :: forall a b. Bool -> a -> b で束縛された型変数です.

という意味です．実際

[code]

    x .&&. y = if x then y else x
    
[/code]

という定義だと，(.&&.) の型は Bool -> Bool -> Bool 以外はありません．  
逆に，最初の型シグネチャをもつような演算子を定義できるかを考えてみましょう．  
型シグネチャー (.&&.) :: Bool -> a -> b によれば x .&&. y
という式において，xの値はBool型，yの値の型は任意の型，式全体(x .&&.
y)の値の型も任意の型(xの値とは違う型でもよい)という意味です．演算子(.&&.)は2つの被演算子の型とは無関係の型の値を生成できなければならないことになります．
例えば x .&&. y = if x then undefined else undefined
のような変な関数なら可能ですが，欲しいものではない可能性が高いですね．


CC BY-SA 4.0
2018-05-09T12:54:14.357
43895
2018-05-09T12:54:14.357
24701
43889
answer