ハスケルは静的にあなたが機能Maybe a -> a
を定義することができることを意味し、入力されたが、質問はNothing
ケースをどうするかです。単にあなたが常に他の場合には、それがスローされます、それJust x
を提供し、x
を返すことを前提としてい
fromMaybe :: a -> Maybe a -> a
fromJust :: Maybe a -> a
fromJust
:fromMaybe
とfromJust
:
Haskellはこちらを参考にすることができ2つの機能があります例外。一方、a
は、Nothing
の場合に返されるべき値の "デフォルトの場合"である2つのパラメータを期待しています。次にMaybe a
が与えられ、Just x
の場合はx
が返されます。他のケース(Nothing
)では前述のようにデフォルトが返されます。
このような要因が存在しない場合に備えて、x
が返されます。だから私はあなたが新しい関数を定義提案:
firstFactorOfJust :: Integral a => a -> a
firstFactorOfJust x = fromMaybe x $ firstFactorOf x
だからあなたfirstFactorOf
関数を呼び出し、結果がNothing
であれば、x
が返されますfirstFactorOfJust
この機能。それ以外の場合は、firstFactorOf
の結果が返されます(ただし、Integral
部分のみ、Just ...
部分は返されません)。物事を少し簡素化するつもりだった、あなた自身の答えに基づいて
EDIT(簡体字)
、私はあなたがもう少しそれを簡素化することができますアイデアを持っていた:
firstFactorOf x | Just z <- find ((0 ==) . mod x) [2..x-1] = z
| otherwise = x
と我々はすべての最適化のファンであるため、sqrt(x)
回の繰り返し(素数チェックのよく知られた最適化)の後で既に停止することができます:
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
firstFactorOf x | Just z <- find ((0 ==) . mod x) [2..isqrt x] = z
| otherwise = x
簡体質問
何らかの理由であなたの問題のいくつか妙に複雑な側面があった:あなたはまったく同じ出力を生成する2つのケースの間の区別をするために警備員を使用しないのはなぜ
firstFactorOf x
| m == Nothing = m
| otherwise = m
where m =(find p [2..x-1])
p y = mod x y == 0
は?さらに
firstFactorOf x = m
where m = (find p [2..x-1])
p y = mod x y == 0
と::あなたがにこれを折り畳むことができますが、それはx
、またはx
の第一の要因を返すようにしたい場合は
firstFactorOf x = find p [2..x-1]
where p y = mod x y == 0
「Nothing」の場合に返されるものは何ですか? –
あなたの質問は、「xが第一の要因であるという仮定を埋め込むにはどうすればよいのですか?(なぜなら、私はおそらく 'おそらくすべてを避けることができます)」または「なぜHaskellにタグなしの組合の概念がないのか」と解釈できます。どちらですか? – Alec
xを返す必要があります。 –