2010-01-14 56 views

回答

22
import Data.Char 

map digitToInt $ show 245 
+0

很好的例子..! – jspcal 2010-01-14 04:27:13

+0

所以我将digitToInt绑定到一个数字的显示命令上? – RCIX 2010-01-14 04:30:39

+0

是的,如果你想使用这种方法......只要注意只传递非负数。否则,你会传递'-''到'digitToInt',这是一个错误。顺便说一句,约翰·博克的冷静的答案有一个负数的乐趣问题...检查出来。 :-) – 2010-01-14 04:43:36

4

这里的例子适合你吗? http://snippets.dzone.com/posts/show/5961

convRadix :: (Integral b) => b -> b -> [b] 
convRadix n = unfoldr (\b -> if b == 0 then Nothing else Just (b `mod` n, b `div` n)) 

例如:

> convRadix 10 1234 
[4, 3, 2, 1] 
> convRadix 10 0 
[] 
> convRadix 10 (-1) 
[9,9,...] (infinite) 

to convert haskell radix by mokehehe on Thu Aug 21 08:11:39 -0400 2008 
+0

我会更像'convRadix b = unfoldr mModDiv其中mModDiv 0 = mzero; mModDiv n = let(q,r)= n \'divMod \'b作为回报(r,q)'(在线条上分割,我在评论中无法做到)但它们都是一样的:) – ephemient 2010-01-14 05:01:20

1
digits :: (Integral a) => a -> [a] 
digits = flip digits' [] . abs 

digits' :: (Integral a) => a -> ([a] -> [a]) 
digits' n = if q == 0 
    then (r :) 
    else (digits q ++) . (r :) 
    where 
    (q, r) = n `divMod` 10 

digits 1234 == [1, 2, 3, 4] 
digits (-1234) == [1, 2, 3, 4] 
+0

或'digits = fst。头。过滤器((==)0。snd)。尾巴 。迭代(\(d,n) - > let(q,r)= n \'divMod \'10 in(r:d,q))。 (,)[]。 abs' ;-) – ephemient 2010-01-14 21:06:52

2
digits :: Int -> [Int] 
digits 0 = [] 
digits n = digits k ++ [r] 
    where k = div n 10; r = mod n 10 
+0

请编辑您的答案,并在每行的开头放置四个空格,以便将其格式化为代码。 – Yitz 2010-11-06 20:07:29

1
digits = reverse . map (`mod` 10) . takeWhile (> 0) . iterate (`div` 10) . abs 
相关问题