我想编写如下程序:
/** @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
?
答案 0 :(得分:2)
首先将其解开。您需要一个从Array
(
[0] => Array
(
[name] => Jacky O'Macky
[groups] => Array
(
[0] => Array
(
[0] => Joseph O'Brien
[1] => Jenna Williams
)
[1] => Array
....
开始的函数。首先考虑一个来自IO [String] -> IO [Int]
的函数-那么就是f a -> f b
!
然后,我们只需要找到一个fmap
的函数。在这种情况下,a -> b
和a ~ [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