将getArgs从IO [String]转换为IO [Int]

时间:2018-09-11 03:54:54

标签: haskell monads

我想编写如下程序:

    /** @var FilesystemAdapter $disk */
    $s3 = Storage::disk('s3');
    return $s3->url($path);

是否可以通过add :: Int -> Int -> Int add a b = a + b main :: IO () main = do args <- getIntArgs case args of [a,b] -> putStrLn $ show $ add a b (来自getIntArgs)来编写函数getArgs

1 个答案:

答案 0 :(得分:2)

首先将其解开。您需要一个从Array ( [0] => Array ( [name] => Jacky O&#039;Macky [groups] => Array ( [0] => Array ( [0] => Joseph O&#039;Brien [1] => Jenna Williams ) [1] => Array .... 开始的函数。首先考虑一个来自IO [String] -> IO [Int]的函数-那么就是f a -> f b

然后,我们只需要找到一个fmap的函数。在这种情况下,a -> ba ~ [String]。现在,我们看到了另一个包装具体类型的函子-b ~ [Int]再次起作用,这次抽象了fmap而不是[]

现在,我们需要一个IO的函数。这是String -> Int

read

getIntArgs = fmap (fmap read) getArgs 起,我们可以写(并且应该更喜欢,它是Haskelly-er):f (g x) = (f . g) x

实际上,您的整个功能就是:

(fmap . fmap) read $ getArgs