質問

私はHaskellのを学習し、型システムを理解しようとこだわってます。

私は、入力のためにシリーズの半分またはスリープラスワン "の長さを返す関数を記述しようとしています。ここでは、再帰的なアプローチを使用して機能で私の試みは、だ(関数は、積分入力に対してのみ有効です):

hotpo :: (Integral a) => a->a
hotpo n = hotpoHelper n 1

hotpoHelper:: (Integral a) => a->a->a
hotpoHelper 1 n = n
hotpoHelper num count
    | even num = hotpoHelper (truncate (num/2)) (count+1)
    | otherwise = hotpoHelper (3*num+1) (count+1)

ここで私はGHC 6.12.3でこのファイルをロードしようとすると、私が手にエラーがある

test.hs:8:30:
    Could not deduce (RealFrac a) from the context (Integral a)
      arising from a use of `truncate' at test.hs:8:30-45
    Possible fix:
      add (RealFrac a) to the context of
        the type signature for `hotpoHelper'
    In the first argument of `hotpoHelper', namely
        `(truncate (num / 2))'
    In the expression: hotpoHelper (truncate (num / 2)) (count + 1)
    In the definition of `hotpoHelper':
        hotpoHelper num count
                      | even num = hotpoHelper (truncate (num / 2)) (count + 1)
                      | otherwise = hotpoHelper (3 * num + 1) (count + 1)

take (truncate (5/2)) [1,2,3]の作品を、私はこのエラーメッセージを理解することができないんだそう。 どこが間違っているんだ?

役に立ちましたか?

解決

はハスケルで/オペレータは小数点除算をフローティングするために使用されます。あなたが本当に浮動小数点除算とtruncateを使用したいをした場合は、浮動小数点数に変換するために最初fromIntegralnumを使用すると思います。あなたが得るエラー(コンパイラは両方の数値のための浮動小数点型を推測するために5/2作品)あなたは整数で、分数分周を使用することはできませんと言っています。ただし、div機能を使用して、あなたがはるかに簡単にやりたいことができます。これは(これは、任意のHaskellの機能のために働く)バッククォートと関数名を囲むことにより、典型的に使用中置である

| even num = hotpoHelper (num `div` 2) (count+1)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top