2016-06-28 14 views
2

に応じて文字列またはINTを返します。私はハスケルがその型式に厳格であることを理解していますが、これを回避する方法はありますか?は、私は、入力として<code>Int</code>を取り、それが<code>> 0</code>またはそれ以外であれば、それは<code>< 0</code>であればダッシュ<code>"-"</code>を返す<code>Int</code>ことを返す関数を作成するにはどうすればよいの入力

+0

これは、依存型の言語が必要です。あるいは、私は「Maybe Int」を使うことを提案します。あなたは「たぶん」と聞いたことがありますか? – pdexter

+0

一方、StackOverflowの精神は私に[回答](https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Dynamic.html#t:Dynamic)を書くよう誘惑します。 [two](https://hackage.haskell.org/package/base-4.9.0.0/docs/Unsafe-Coerce.html#v:unsafeCoerce);一方で、教育の精神は、この質問が、主に答えによって損なわれる初心者に起こると私に伝えています。 –

+2

@DanielWagnerおそらく自己回答型の質問はこれに対するより高いレベルの正式な答えに有益でしょう。私はこの性質のいくつかの同様の質問を見てきました(同じ問題に自分自身で実行)。あなたはまた、その答えに警告を追加して、新入者にその言語を説得させることもできます。 – jkeuhlen

答えて

8

Haskellは静的に型指定されているため、通常は実行時の内容によっては型を変更できません。あなたはその後、プログラムのクエリで使用すると、左のコンストラクタまたは右を扱っていることができるかどうか

data Either a b = Left a | Right b 

fun :: Int -> Either Int String 
fun x | x > 0 = Left x 
     | otherwise = Right "-" 

Eitherは次のように定義されています

ただしEitherタイプを使用することができますコンストラクタ。

6

これを行うためのハスケルの方法は、Maybeを使用していると思います。その後

positive :: Int -> Maybe Int 
positive x | x >= 0 = Just x 
      | x < 0 = Nothing 

、あなたがJustNothingを得たかどうかを確認するために、パターンマッチをすることができます。それ以外の場合は、あなたの言うことをする関数を書く方法がありません - その署名は何ですか:Int -> IntまたはInt -> String

5

haskellの関数は、単一の型を返す必要があります。これが有益であるかどうかについて論じることはできますが(this Programmers.SE post参照)、はるかに複雑な言語の部分を掘り下げずに対処しなければならないことです。

コメントと@Alecに記載されている@pdexterのように、Maybeがこれを処理する最良の方法です。

import Data.Maybe 
...  

f :: Int -> Maybe Int 
f num 
| x >= 0 = Just num 
| x < 0 = Nothing 

は、その後、あなたの他のコードでは、あなたが扱うことができる Maybe

-- Let's assume you want to bind the result to a String type 
let num = f Number 
putStrLn $ case num of 
    Just x -> show x 
    Nothing -> "-"