Próbujesz napisać moduł, który zwraca zewnętrzny adres IP mojego komputera. Funkcja, a następnie zastosowanie soczewki w celu uzyskania responseBody
, typ I kończy się z Data.ByteString.Lazy.Internal.ByteString
. Ponieważ chcę odfiltrować końcowy "\ n" wynikowego ciała, chcę użyć tego później do wyrażeń regularnych. Problem: Ten pozornie bardzo specyficzny typ ByteString nie został zaakceptowany przez bibliotekę regex i nie znalazłem możliwości przekonwertowania go na String
.Data.ByteString.Lazy.Internal.ByteString na ciąg?
Oto moja słaba próba do tej pory (nie kompilacja).
{-# LANGUAGE OverloadedStrings #-}
module ExtIp (getExtIp) where
import Network.Wreq
import Control.Lens
import Data.BytesString.Lazy
import Text.Regex.Posix
getExtIp :: IO String
getExtIp = do
r <- get "http://myexternalip.com/raw"
let body = r ^. responseBody
let addr = body =~ "[^\n]*\n"
return (addr)
Więc moje pytanie brzmi oczywiście: Jak przekonwertować śmieszne specjalną ByteString do String
? Wyjaśnienie również, w jaki sposób sam mogę podejść do tego problemu. Próbowałem użyć unpack
i toString
, ale nie mam pojęcia, co zaimportować, aby uzyskać te funkcje, jeśli istnieją.
Będąc bardzo sporadycznym użytkownikiem haskell, zastanawiam się też, czy ktoś mógłby mi pokazać idiomatyczny sposób określania takiej funkcji. Wersja, którą tu pokazuję, w końcu nie uwzględnia możliwych błędów/wyjątków w czasie wykonywania.
myślę, że to przesada, aby użyć wyrażenia regularnego w tym przypadku i przejść do wersji, która nadal wykorzystuje 'ByteString' można zaimplementować coś takiego jak' trim' łatwo przycinać i '' dropWhile' Data.Char.isSpace' i 'reverse'. – epsilonhalbe
, aby dowiedzieć się, gdzie można znaleźć funkcje - użyj goo ... uhm no - [hoogle] (https://www.haskell.org/hoogle/?hoogle = isspace) – epsilonhalbe
@epsilonhalbe Tak więc w moim przypadku, biorąc pod uwagę, że już zaimportowałem '' Data.ByteString.Lazy'', będzie to '' let body = Char8.unpack (r ^. responseBody) ''? U mnie to daje: extip.hs: 6: 1: error: Nie można załadować interfejsu dla 'Data.BytesString.Lazy ' Być może chodziło Ci o Data.ByteString.Lazy (z bytestring-0.10.8.1) Data.ByteString . Obiektyw (z obiektywu-4.14) Data.ByteString.Char8 (od bytestring-0.10.8.1) Użyj opcji -v, aby wyświetlić listę szukanych plików. Błąd, załadowane moduły: brak. – BitTickler