haskell – 如何跨函数调用链传递值

假设我有以下数据结构和功能:

data Settings = Settings { dbName :: String } deriving Show

-- username to user id lookup
getUserId :: Settings -> String -> Int
getUserId settings username = 1

-- checks permission for a given user id
hasPermission :: Settings -> Int -> Bool
hasPermission settings userId = True

我希望能够链接getUserId和hasPermission与一些语法糖,而不必携带设置实例,因为我链接函数调用.像这样的东西:

main = do
  let _permission = Settings{dbName="prod"} >>= getUserId "bob" >> hasPermission
  print _permission

这(显然)不起作用.

这个的任何转变模式?

最佳答案 在我看来,解决此类问题的最简单方法是使用部分应用程序,如下所示:

main = do
  let settings = Settings { dbName="prod" }
  let getUserId' = getUserId settings
  let hasPermission' = hasPermission settings
  let _permission = hasPermission' $getUserId' "bob"
  print _permission

但是,如果你将’common’参数放在最后,你也可以使用内置的阅读器monad实例:

main :: IO ()
main = do
  let getPermission = (flip getUserId) "bob" >>= (flip hasPermission)
  print $getPermission $Settings { dbName="prod" }

这里getPermission是一个本地函数,其类型为Settings – >布尔.通常,我认为第一个选项(部分应用程序)更简单,更容易理解.

点赞