2016-10-08 12 views
-3

を数字のリスト(つまり[Int])に変換するfoldrの例を作成しようとしています。Haskellの数値型について混乱しています

pickDigit num pos = (num `div` (10^pos)) `mod` 10 

toDigits num = foldr (\pos acc -> (pickDigit num pos):acc) [] [0 .. floor (logBase 10 num)] 

これは正常に読み込まれます。しかし、私はそれを実行しようとすると、例えば

> toDigits 1234 

私は理解していないタイプのエラーメッセージが表示されます。

ロードされたコードの種類についてHaskellに問い合わせて、それらの型をソースファイルに明示的に含めると、ロード時にエラーメッセージが表示されます。明示的にタイプをIntegerまたはIntに制限しようとすると、さらにエラーメッセージが表示されます。

私はいくつかの提案を感謝します。ありがとう。

+5

。 –

答えて

1

logBaseはフローティング必要ですが、それはこの作品

ではありません。また、エラーメッセージを投稿してください

[0 .. floor (logBase 10 $ fromIntegral num)] 
+0

ありがとうございます。できます。しかし、なぜコードがロードされたときにこの問題が現れないのでしょうか?ソースに宣言がない場合、コードは正常に読み込まれます。 ':t toDigits' - >' toDigits ::(RealFrac a、Integral a、Floating a)=> a - > [a] ' – RussAbbott

+1

具体的なタイプ。これは、積分型の仮説型 'a'と' RealFrac'型のため、この関数が動作するため、ロードされます。 –

+0

Alexanderのコメントに加えて、 'Num a => a'型の引数として' 1234'の関数を呼び出します。 'a'は' Integral'と 'RealFrac 'の両方のインスタンスを持つ仮説型になります'。 – chepner

関連する問題