또 다른 아이디어는 말하기 것입니다 : 마지막 숫자는 1, 마지막 숫자는 10, 그 전에는 100으로 계산합니다. 그래서 숫자 목록을 숫자로 변환하려면, 역순으로 (뒤에서 시작하기 위해) 숫자를 상응하는 10의 거듭 제곱과 곱하고 그 결과를 더해야합니다.
는 두 목록 사용 zipWith (*)
의 해당 숫자를 곱하고 sum
를 사용, 모든 것을 함께 추가 iterate (*10) 1
를 (! GHCi 또는 포옹에 그것을 시도), 사용할 수있는 10 세의 힘을 얻기 위해, reverse
사용 목록을 반대합니다 - 정말 몇 가지 라이브러리 함수를 아는 데 도움이됩니다!
fromDigits [1,2,3,4]
==> sum (zipWith (*) (reverse [1,2,3,4]) [1,10,100,1000, ....]
==> sum (zipWith (*) [4,3,2,1] [1,10,100,1000, ....])
==> sum [4 * 1, 3 * 10, 2 * 100, 1 * 1000]
==> 4 + 30 + 200 + 1000
==> 1234
그러나,이 솔루션으로 인해 reverse
에 대한 호출에 당신이 구축하고 있기 때문에, foldl
가진 것보다 느립니다 : 함께 비트를 넣어, 당신은 평가의
fromDigits xs = sum (zipWith (*) (reverse xs) (iterate (*10) 1))
예를 얻을 수 열의 그 힘은 그들을 직접적으로 다시 사용하는 것입니다. 더하기 측면에서, 숫자를 짓는이 방법은 사람들이 일반적으로 생각하는 방식 (더 이상 나는하지 않습니다!)에 가장 가까운 반면, foldl
-solutions은 Horner's rule을 사용합니다.
또는 쿨러 포인트 무료 - fromDigits = foldl ((+). (* 10)) 0 : –
굉장! 완벽하게 작동합니다. 이것은 내가해야 할 일이라고 생각했던 것이었지만, 당신은 내가 할 수있는 것보다 훨씬 좋았습니다! – Paul
그래도 작동하지만 addDigit 파트가 어떻게 작동하는지 정확히 알 수는 없습니다. 나는 foldl이 함수를 취하고리스트가리스트의 모든 요소에서 그것을한다는 것을 안다. 그러나 addDigit은 0 (num)을 10으로 곱한 다음 요소를 추가하는 것처럼 보인다. 내가 빠졌어? – Paul