2017-02-11 12 views
1

複数のパターンを使用するFregeの関数を定義する際に問題があります。基本的には、タプルのリストを反復してマッピングを定義しています。私は次のエラーを取得Fregeで複数のパターンを定義する方法は?

​​

:私は次のようにそれを簡略化してきた私は、関数定義の中で複数のパターンを使用して行うthisのような他の例を見てきました

E morse.fr:3: redefinition of `foo` introduced line 2 

をので、私私が間違っていることを知らない。ここでエラーが発生するのはなぜですか?私はFrege(そしてHaskellに初めての人)には新しく、欠けているものがあるかもしれませんが、これは問題ではないと私は思っています。

私はバージョン3.24-7.100でコンパイルしています。

+2

'(baz、zab):foobar'パターンの周りに括弧を追加する必要があるかもしれません。 'foo bar((baz、zab):foobar)のようなもの' – Alec

答えて

2

これは、Haskellファミリの新言語に影響する純粋な構文上の問題です。関数アプリケーションが中置式より優先度が高いというルールを内部化するまで、時間がかかりません。関数適用の

  • 複雑な引数は括弧が必要になります。

    これは結果をもたらします。

  • 中置式では、演算子のどちらかの側の関数アプリケーションにかっこは必要ありません(ただし、関数アプリケーションの個々のコンポーネントでも必要です)。

はフレーゲには、ほかに、以下のルールが成立する:あなたはこれを適用したとき、そこで

data Number = Z | Succ Number 

a + Z  = a 
a + Succ b = Succ a + b 

The syntax of function application and infix expressions on the left hand side of a definition is identical to the one on the right hand side as far as lexemes allowed on both sides are concerned. (This holds in Haskell only when @ and ~ are not used.)

これは、あなたがこのような追加機能を定義することができますですあなたの例では、構文的に見ると、:演算子を再定義するつもりです。あなたが望むものを達成するために、あなたはこのようにそれを記述する必要があります。

foo bar ((baz, zab):foobar) = .... 
-- ^    ^

これは、あなたが構築されているリストにfooを適用する状況に対応:

foo 42 (x:xs) 

あなたが書い

foo 42 x:xs 
(foo 42 x):xs 
+0

これはあまり意味があります。詳しい答えをありがとう! –

関連する問題