Haskell IO,cassava文档,Data.csv

gtlvzcf8  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

我试图在Haskell中学习IO,我发现它非常混乱。在 “使用decodeByName:“ 下浏览了cassava documentation on hackage

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V

data Person = Person
    { name   :: !String
    , salary :: !Int
    }

instance FromNamedRecord Person where
    parseNamedRecord r = Person <$> r .: "name" <*> r .: "salary"

main :: IO ()
main = do
    csvData <- BL.readFile "salaries.csv"
    case decodeByName csvData of
        Left err -> putStrLn err
        Right (_, v) -> V.forM_ v $ \ p ->
            putStrLn $ name p ++ " earns " ++ show (salary p) ++ " dollars"

字符串
我有两个问题
1.在Person的声明中,他们用了!String而不是String,为什么?我用String运行了同样的例子,结果没有什么不同。堆栈构建器网站上的教程也使用了!。我在这里遗漏了什么?
1.在main函数中,

Right (_, v) -> V.forM_ v $ \ p ->
            putStrLn $ name p ++ " earns " ++ show (salary p) ++ " dollars"


做什么?
我知道post $ \ p是一个匿名函数,它将p中的名称和p中的salary串联起来,显示salary,因为它是一个整数。
p代表什么?它是一个元组,一个变量吗?他们是否使用p作为Person的数据结构?
表达式Right (_, v) -> V.forM_ v的含义是什么?

7gcisfzg

7gcisfzg1#

!在一个类型被称为BangPattern之前,它会导致参数在构造数据类型时被评估为弱头范式。非正式地说,它减少了懒惰的数量,在某些情况下会提高性能。
Right (_, v) -> V.forM_ v $ \p -> ...这部分模式匹配v,它是一个Vector行,在你的例子中是Person类型。V.forM_是一个来自vector包的Monad m => Vector a -> (a -> m b) -> m ()类型的函数。本质上,它对向量的每个元素执行一个一元操作,在你的例子中,Person -> IO ()类型的IO操作。因此,在本例中,p是一个单独的Person

相关问题