web-dev-qa-db-ja.com

Haskellの関数宣言について本当に混乱しています

これは宿題なので、完全な答えではなく、ヒントまたは学習できる場所へのリンクのみを希望します。これは私に与えられたものです:

allEqual :: Eq a => a -> a -> a -> Bool

これから理解できることは、3つの値(この場合はaaa?)を比較して、それらがすべて等しいかどうかを返すことになっているということです。 。これは私が試したものです:

allEqual :: Eq a => a -> a -> a -> Bool
allEqual x y z do
  Bool check <- x == y
  Bool nextC <- y == z
  if check == nextC
    then True
    else False

私は正直に言ってHaskellで完全に道に迷ってしまったので、関数の読み方や宣言方法に関するヒントがあれば非常に役立ちます。

9
Nico Arevalo
allEqual :: Eq a => a -> a -> a -> Bool

シグネチャは次のとおりです。allEqualは、a型の3つの値を消費します。タイプBoolの結果を生成します。 Eq a =>部分は、aが持つことができる可能な操作を制限します。これは、aの型が何であれ、Eqで定義された要件を満たす必要があることを示しています。これらの要件はここにあります: http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#t:Eq これで、aが実行できる操作がわかったので、型シグネチャに従って関数を完成させることができます。

2
ƛƛƛ

方法は次のとおりです。

allEqual :: Eq a => a -> a -> a -> Bool
allEqual x y z = x == y && y == z

これは何を意味するのでしょうか?

最初の行は、関数の型シグネチャを定義しています。

人間の言葉で言えば、次のようになります。

どのタイプのallEqualにもaという関数があります。これはEq a *のインスタンスを必要とし、すべてaタイプの3つのパラメーターを取り、Boolを返します

2行目は言う:

関数allEqualは、パラメータxy、およびzに対して、x == y && y == zを評価する必要があります。これは、xyと等しく、yzと等しい。

*インスタンスまたは型クラスは、他の多くのプログラミング言語にはない言語機能であるため、それらの意味がわかりにくい場合は、まずそれらについて学ぶことをお勧めします。

1
Markus Appel