pokazać funkcji w Haskell nie wydaje się robić to, co powinien:Haskell: Show spieprzone?
Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack
overflow
Prelude> show str
"\"Stack\\n\\n\\noverflow\""
Prelude>
Kiedy deklarować funkcje, ja normalnie umieścić podpisy typu jak Pokaż, który nie radzi sobie z nowymi liniami poprawnie . Chcę traktować \n
jako znaki nowej linii, a nie dosłownie: "\n"
. Po zmianie typu na String, funkcje działają poprawnie. Ale będę musiał zaimplementować funkcję oddzielna dla liczb całkowitych, pływaków, itp, itd.
na przykład, może zadeklarować funkcję:
foo :: (Show x) => x -> IO()
foo x = do
putStrLn $ show x
... i nazwać go w ten sposób:
foo "stack\n\noverflow"
foo 6
foo [1..]
Jak można uzyskać funkcję zwracania tego, co jest oczekiwane? To znaczy. która funkcja jest podobna do show
, ale może zwracać ciągi zawierające znaki nowej linii?
Czy możesz podać nam konkretnego przypadku korzystania z tego? To ułatwi zrozumienie twojego zamiaru. – Martijn
Można po prostu dodać czek, aby sprawdzić, czy dane wejściowe jest ciągiem, i po prostu wydrukować. Dopasowywanie wzorców jest bardzo przydatną rzeczą. – Rayne
"show" jest podobne do 'repr()' w Pythonie i 'inspect' w Ruby, jeśli używałeś już tych języków. –