2011-01-22 11 views
5

だから、私は複数の定義(警備員)との機能を持っている、そして、私はそれを持っているのいずれか返すようにしよう(、b)またはてるそれが一致するものに応じて、[ (a、b)]しかし、コンパイラはエラーを投げているので、それらは異なる型です。私はこれを解決するためにどちらかを使用しようとしていましたが、恐らくそれを正しく使用していませんでした。どんな助け?それはあなたの関数は、いずれかのタイプ(a、b)は、[(a.b)]を返す必要がありますので、どちらかがあなたのために動作しますので、Haskellでは異なる型を返す関数を取得する方法

+1

:-)説教のために申し訳ありません。 本当に別のタイプを返そうとしていますか?あなたが2つのケースを区別するために結果にパターンマッチするつもりなら、いずれかが問題ありません。または、シングルトンリストが最初のケースで実行するかどうか?あなたは何をしようとしているのかについてもっと詳しく説明できますか? – b0fh

+0

http://paste.pocoo.org/show/325066/これまでの私の関数 –

+0

は、魔法の呪文を読むようなものです。それはどういう意味ですか? – luqui

答えて

9

Either - またはそれと同等のカスタムデータ型が - だけですこれを行う方法。 、あなたの問題について何も知らない、

foo n = case stuff n of 
      Left (a,b) -> ... 
      Right pairs -> ... 

しかし中:誰かがこの関数を呼び出すときに、彼らはパターンマッチは、それが返される2種類のどちらを見つけるためにすることができます

stuff :: Int -> Either (Int,Int) [(Int,Int)] 
stuff 0 = Left (0, 0) 
stuff n = Right [ (x,x) | x <- [0..n] ] 

:ここではダム例です一般的に私はあなたの機能の意味についてもう少し考えることをお勧めします。それは何を取りますか、それは何を返しますか?正確で、数学的である。答えが簡単になればなるほど、この関数はプログラムの残りの部分とHaskellの概念とでよりスムーズに機能します。私の場合、このような記述では、Eitherがめったに起きません。どのようにして2つの結果を統合できますか?関数に意味がある場合は、Left (a,b)の代わりにシングルトンリスト[(a,b)]を返してください。

Haskellはあまりにもスマートにしようとする機能、あなたはPythonやjQueryのからに使用することができるタイプとうまく再生されません。それをダムで正確に保ちましょう。から複雑さを得て、これらの単純な部分を構成します。これについて興味がある場合は、問題の詳細、達成しようとしていること、それがなぜそのように働くのを望むのかについて、別の質問をしてください。警備員は、実行時に一致している一方で、関数の戻り値の型は、コンパイル時に知らなければならないので、あなたが直接それを行うことはできません

+0

は私たちが型システムのするプロパティが*保存*のことであることを追加してみましょう:私たちはタイプ 'のものを持っていた場合には大まかに言えば、::のInt - >(INT、INT) '' stuff 7'への呼び出しは '[(x、x)| '[(Int、Int)]'型の例では、x < - [0..n] 'です。これは 'stuff'の宣言された戻り値の型とは異なり、したがって型は保持されません。タイプシステムを何かのために信頼しなければならない場合、この不一致を排除する必要があります。したがって、型チェッカーは私たちのプログラムを不正な型として拒否します。 –

0

機能は、一種類のみを返すことができます。

私はあなたがいずれかを使用しているかと間違っていたが、ここでその使い方の簡単な例であることを確認していない:

test a b = 
    if a == True 
    then Left (a,b) 
    else Right [(a,b)] 
+0

はそうここに私の機能は今です:のhttp://paste.pocoo http://paste.pocoo.org/show/325090/ ここでエラーです。 org/show/325093/ –

+0

@Chris 'Right lgst i'は' Right(lgst i) 'でなければなりません。 – dave4420

+0

okですので、http://paste.pocoo.org/show/325143/は動作しますが、後者の2人のガードはhttp://paste.pocoo.org/show/325144/のように見える必要があります。http: /paste.pocoo.org/show/325145/ –

関連する問題