Haskell'de isteğe bağlı bir argüman alabilen küçük bir kabuk betiği yazıyorum. Ancak, argüman mevcut değilse, bir değer istemek için stdin'den bir hat almak istiyorum.Haskell'de IO koşullu olarak işlenmenin deyimsel yolu
Haskell'de bunu yapmanın deyimsel yolu ne olurdu?
#!/usr/bin/env runhaskell
import Control.Applicative ((<$>))
import Data.Char (toLower)
import IO (hFlush, stdout)
import System.Environment (getArgs)
main :: IO()
main = do args <- getArgs
-- here should be some sort of branching logic that reads
-- the prompt unless `length args == 1`
name <- lowerCase <$> readPrompt "Gimme arg: "
putStrLn name
lowerCase = map toLower
flushString :: String -> IO()
flushString s = putStr s >> hFlush stdout
readPrompt :: String -> IO String
readPrompt prompt = flushString prompt >> getLine
Oh, ve bilmek istiyorum Control.Applicative
veya Control.Arrow
bir şey ile bunu yapmanın bir yolu olup olmadığını. Bu iki modüle oldukça meraklıyım.
Teşekkürler!
Bunu beğendim. Oldukça temiz. Vaka ifadesindeki modeller kapsamlı değildir, ancak kolayca düzeltilebilir. –
@ Ionuț G. Stan: Anlamınızı tek tek tercüme ediyorum. Örüntüyü kapsamlı hale getirmek, örneğimin daha az temiz olmasını sağlar. – fuz
Alt satırda, "case args" in önüne "lowerCase <$>" ifadesini koydum, böylece komut satırı argümanı da küçültülecekti. Ayrıca, istenen davranışı daha yakın kalmak için sadece [arg] 've' _' yerine [[] 'yerine) eşleştirebilirsiniz. –