0

私は機能を持っています:

powerOf :: Int -> Int -> Int

OS の使用例:

*Main Data.List> powerOf 100 2
2
*Main Data.List> powerOf 100 5
2

2 つの質問があります。最初 - 機能しない理由:

map (powerOf 100) [2, 5]

[2、2]を取得したい。

そして2問目。pariatl 関数を作成しようとしています。このようなもの:

powerOfN :: Int -> Int
powerOfN num = powerOf num

そのように使用するには:

let powerOf100 = powerOfN 100
powerOf100 2
powerOf100 5

しかし、私はエラーメッセージを受け取りました:

simplifier.hs:31:15:
    Couldn't match expected type `Int'
           against inferred type `Int -> Int'
    In the expression: powerOf num
    In the definition of `powerOfN': powerOfN num = powerOf num

これは5月のコードでいっぱいです:

divided :: Int -> Int -> Bool
divided a b = 
  let x = fromIntegral a
      y = fromIntegral b
  in (a == truncate (x / y) * b)

listOfDividers :: Int -> [Int]
listOfDividers num =
               let n = fromIntegral num
                   maxN = truncate (sqrt n)
               in [n | n <- [1.. maxN], divided num n]


isItSimple :: Int -> Bool
isItSimple num = length(listOfDividers num) == 1

listOfSimpleDividers :: Int -> [Int]
listOfSimpleDividers num = [n | n <- listOfAllDividers, isItSimple n]
                     where listOfAllDividers = listOfDividers num

powerOfInner :: Int -> Int -> Int -> Int
powerOfInner num p power
             | divided num p = powerOfInner (quot num p) p (power + 1)
             | otherwise = power

powerOf :: Int -> Int -> Int
powerOf num p = powerOfInner num p 0


powerOfN :: Int -> Int
powerOfN num = powerOf num

powerOf num の p の最大パワーを返します。例: 100 = 2 * 2 * 5 *5、したがって powerOf 100 2 = 2. 10 = 2 * 5、したがって powerOf 10 2 = 1.

エラーを修正するには?ありがとう。

4

2 に答える 2

5

powerOfN 関数とは別に、コードを使用します。の問題を再現できませんmap (powerOf 100) [2,5]

*Main> map (powerOf 100) [2,5]
[2,2]

何らかのエラーが発生しますか?


2番目の問題について:

powerOfN :: Int -> Int
powerOfN num = powerOf num

型シグネチャが正しくありません。

powerOfN は整数を取り、整数を取り、整数を返す関数を返します。

したがって、型シグネチャは

powerOfN :: Int -> (Int -> Int)

これは(確認してくれたdelnanに感謝します)と同じです:

powerOfN :: Int -> Int -> Int
于 2010-12-05T14:04:11.533 に答える
0

私はあなたの混乱を見ていると思います。引数を 1 つ取る "powerOf" のバージョンが必要なので、引数を 1 つだけ取る "powerOfN" を定義しようとしました。しかし、実際には「powerOf」はすでにそれを行っています。「->」を型演算子として読む必要があります。「+」が数値の演算子であるように、「->」は型の演算子です。2 つの型を受け取り、新しい型を返します。そう

Foo -> Bar

「Foo」から「Bar」への関数です。しかし、これは型なので、次のように別の「->」操作を適用できます。

Int -> (Int -> Int)

これは、Int を受け取り、2 番目の Int を受け取り、結果として Int を返す新しい関数を返す関数を意味します。

Haskell は "->" 演算子を右結合として定義しているため、この場合の括弧は削除できるため、次のようになります。

Int -> Int -> Int

「powerOf」関数のタイプはどれですか。したがって、「powerOf」を使用して 1 つの引数を与えると、2 番目の引数を必要とする新しい関数が返されます。それはあなたが望んでいたものです。

于 2010-12-05T15:06:47.723 に答える