2017-01-29 10 views
-1

このコードは、2から始まるIntegerの最初の要素を戻すか、またはそれが小数点の場合は何も戻しません。Int IntからInt

例:firstFactorOf 24に戻り、「わずか2」

例:firstFactorOf 11に戻り、「何もない」

私の質問があり、私は「わずか2」が表示されているかではなく、値2を返すだろうか因数がない場合はxを返します。

firstFactorOf x 
    | m == Nothing = m 
    | otherwise = m 
    where m =(find p [2..x-1]) 
      p y = mod x y == 0 

//RETURNS: 
ghci> firstFactorOf 24 
Just 2 
ghci> firstFactorOf 11 
Nothing 
+0

「Nothing」の場合に返されるものは何ですか? –

+0

あなたの質問は、「xが第一の要因であるという仮定を埋め込むにはどうすればよいのですか?(なぜなら、私はおそらく 'おそらくすべてを避けることができます)」または「なぜHaskellにタグなしの組合の概念がないのか」と解釈できます。どちらですか? – Alec

+0

xを返す必要があります。 –

答えて

-1
import Data.List 
import Data.Maybe 

firstFactorOf x 
    | m == Nothing = x 
    | otherwise = fromJust m 
    where m =(find p [2..x-1]) 
      p y = mod x y == 0 

これは私が後にしたものでした。あなたがなぜこのように複雑にしたのかは分かりません。

4

ハスケルは静的にあなたが機能Maybe a -> aを定義することができることを意味し、入力されたが、質問はNothingケースをどうするかです。単にあなたが常に他の場合には、それがスローされます、それJust xを提供し、xを返すことを前提としてい

fromMaybe :: a -> Maybe a -> a 
fromJust :: Maybe a -> a 

fromJustfromMaybefromJust

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
+0

これはあまりにも複雑だった。質問に答えた自分のソリューションを投稿しました。なぜこのような簡単な作業のための新しい機能を提案するのですか? –

+0

新しい機能を提案する必要はありません。たとえば、 'Nothing'で始まらず、単に' x'を返すことができます。あなたの質問は「Int Intell」に「Just Int」と書かれていました...あなたは「変換」を探します。これは、あるタイプのものから別のタイプのものに変換するときに、人々が行うことです。さらに、例えば、検索に失敗した場合に 'Nothing'を返すことは*エレガント*と考えられます。 –

+0

最後に、それはあなたが単純にそれがどのように動作しているか分からないという教科書から関数をコピーしたように見えます(そうでなければ、おそらく 'Nothing'を返すことはできません)... –

1

、これは動作するはずです:

firstFactorOf x = 
    let 
    p y = mod x y == 0 
    m = (find p [2..x-1]) 
    in 
    fromMaybe x m 
関連する問題