これは不必要に長い答えであり、私はなぜそれが受け入れられたのか分からない。最も高いupvoted答えに示唆されるようにmaybe
またはData.Maybe.fromMaybe
を使用してください。それに続くのは、実用的なアドバイスではなく、もっと多くの思考実験です。
これで、さまざまな種類の機能を持つ関数を作成しようとしています。これはクラスを作る良い時期です。 JavaやC++でプログラミングしたことがあるなら、Haskellのクラスはそれらの言語のようなものです。
class Nothingish a where
nada :: a
このクラスはNothing
のクラスの同等であると想定される値nada
を、定義します。今、楽しい部分:このクラスのインスタンスを作る!タイプMaybe a
の値については
instance Nothingish (Maybe a) where
nada = Nothing
、何もないような値は、よく、Nothing
です!これは1分で奇妙な例になるでしょう。しかしその前に、このクラスのインスタンスもリストにしましょう。
instance Nothingish [a] where
nada = []
空のリストはNothingのようなものですよね?したがって、String(Charのリスト)の場合、空の文字列""
が返されます。
数値も簡単に実装できます。あなたはすでに0が数字の「無し」を表していることを示しています。
instance (Num a) => Nothingish a where
nada = 0
あなたはファイルの先頭
{-# LANGUAGE FlexibleInstances, UndecidableInstances, OverlappingInstances #-}
それともあなたはそれをコンパイルするときに、これらの言語プラグマのフラグを設定することが可能で、特別なラインを入れない限り、この1つは実際には動作しません。彼らを心配することはなく、もっと魔法を使うだけです。
今、あなたはこのクラスとそのインスタンスを持っています...今、それらを使用する関数を書き直しましょう!
eliminate :: (Nothingish a) => Maybe a -> a
eliminate (Just a) = a
eliminate Nothing = nada
お知らせ私だけnada
に0
を変更し、残りは同じです。それをスピンアップしよう!
ghci> eliminate (Just 2)
2
ghci> eliminate (Just "foo")
"foo"
ghci> eliminate (Just (Just 3))
Just 3
ghci> eliminate (Just Nothing)
Nothing
ghci> :t eliminate
eliminate :: (Nothingish t) => Maybe t -> t
ghci> eliminate Nothing
error! blah blah blah...**Ambiguous type variable**
価値観に適しています。 (ちょうど何もない)がNothingに変わったことに気づく。それは奇妙な例だったかもしれません。とにかく... eliminate Nothing
についてはどうですか?結果の型はあいまいです。私たちが期待していることは分かりません。だから、私たちはどのようなタイプを望んでいるのかを伝える必要があります
ghci> eliminate Nothing :: Int
0
他のタイプのものを試してみてください。それぞれについてnada
が得られることがわかります。だから今、あなたはあなたのcombine
機能で、この機能を使用する場合、あなたはこの取得:
ghci> let combine a b c = (eliminate a, eliminate b, eliminate c)
ghci> combine (Just 2) (Just "foo") (Just (Just 3))
(2,"foo",Just 3)
ghci> combine (Just 2) Nothing (Just 4)
error! blah blah Ambiguous Type blah blah
をあなたはまだ「何も」と入力しないものを示すために持っている通知はある、またはあなたが何を期待戻り値の型を示しています。
ghci> combine (Just 2) (Nothing :: Maybe Int) (Just 4)
(2,0,4)
ghci> combine (Just 2) Nothing (Just 4) :: (Int, Int, Int)
(2,0,4)
または、タイプシグネチャを明示的にソースに入れることで、関数の種類を制限することができます。これは、関数の論理的な使用が、同じ型のパラメーターでのみ使用されるということであれば理にかなっています。
combine :: (Nothingish a) => Maybe a -> Maybe a -> Maybe a -> (a,a,a)
combine a b c = (eliminate a, eliminate b, eliminate c)
3つのすべてのものが同じタイプの場合にのみ機能します。そうすれば、Nothing
は他のタイプと同じタイプであると推測されます。
ghci> combine (Just 2) Nothing (Just 4)
(2,0,4)
曖昧さはありません。しかし今は前と同じようにミックスしてマッチさせるのは誤りです。
ghci> combine (Just 2) (Just "foo") (Just (Just 3))
error! blah blah Couldn't match expected type blah blah
blah blah blah against inferred type blah blah
まあ、私はそれが十分に長く、過度の答えだったと思います。楽しい。
文字列を返すことを期待するなら、 'Nothing'の応答はどうでしょうか? –
あなたは、すべてのタイプについて「結果なし」を示すために使用できるトークンを探しています...それはまさにNothingです。 'Nothing'を' a'に変換する統一的な方法がないので、 'abe - a 'という総和関数はありません。あなたができる最善のことは、 ''おそらく、おそらくb、おそらくc) - >たぶん(a、b、c) ' –
の可能な複製を書くことです。 http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that-contains-just) –