Подтвердить что ты не робот

Преобразование NominalDiffTime в реальное

В документации для Data.Time.Clock Я вижу это:

Функции преобразования будут обрабатывать его как секунды. Он имеет точность 10 ^ -12 с

Какую функцию превратит NominalDiffTime в Double? Не повезло hoogling it

4b9b3361

Ответ 1

Вам нужно обратить больше внимания на список экземпляров для этого типа. Один из перечисленных экземпляров - Real NominalDiffTime. Это позволяет использовать realToFrac :: (Real a, Fractional b) :: a -> b для преобразования в Double, так как Double является экземпляром Fractional.

Так как NominalDiffTime имеет экземпляр Real, а Double имеет экземпляр Fractional, вы можете использовать realToFrac, как если бы он имел подпись типа NominalDiffTime -> Double. Конечно, realToFrac является более полиморфным, чем это, поэтому вам может понадобиться дать ему подсказки, какие типы вы хотите конвертировать. Но он, безусловно, способен на это преобразование, если он может определить типы.

Ответ 2

Вы можете hoogle полностью,, просто нужно сделать подпись более общей. В этом случае вы знаете, что оба типа приближают действительные числа, так что я бы поискал. По общему признанию, для этого потребовались бы некоторые, как в этом случае: столь же разумный запрос (RealFloat a, RealFloat b) => a -> b не дал бы вам правильный realToFrac справа на втором месте.

Но всегда стоит попробовать более общие способы, которые могут быть определены для функции, которая вам нужна. Обычно, если у какого-либо типа есть экземпляры стандартных классов, то модуль не будет сильно беспокоить, чтобы экспортировать специализированные версии той же функциональности.

realToFrac, в частности, является чем-то вроде шутника, который очень часто работает для числовых преобразований, возможно, 2-й наиболее часто после fromIntegral. (Хотя, честно говоря, мне не слишком нравится эта функция, потому что математически "преобразование реального числа в дробь" довольно ужасно, но о хорошо...)