无法解释Haskell代码的位置和模式匹配

时间:2017-10-07 15:01:08

标签: haskell where-clause

我很难解析mf m y如何分配值,甚至为什么在where部分的分配左侧可能有3个变量。< / p>

问:有人可以解释两种情况下会发生什么吗?(即空列表和包含某些元素的列表)

-- | A variant of 'foldl' that has no base case,
-- and thus may only be applied to non-empty structures.
--
-- @'foldl1' f = 'List.foldl1' f . 'toList'@
foldl1 :: (a -> a -> a) -> t a -> a
foldl1 f xs = fromMaybe (errorWithoutStackTrace "foldl1: empty structure")
                (foldl mf Nothing xs)
  where
    mf m y = Just (case m of
                     Nothing -> y
                     Just x  -> f x y)

(这是source codefoldl1 function)。

3 个答案:

答案 0 :(得分:7)

$field = $this->User->find( 'all', array( 'conditions'=>array( 'User.specialist_id' => $arrayOfSpecialistIds, 'User.role'=>'careproviderRole', 'User.gender'=>$this->request->data['gender']) ) 子句中的定义遵循与全局定义相同的语法,因此where定义了一个名为mf m y = ...的函数,该函数采用名为mfm的参数

答案 1 :(得分:4)

  

我很难解析为mf m y分配的值,甚至为什么可以有3个变量。

这里没有定义三个变量:定义变量mf这是一个函数,my是函数的两个参数 mf

我们可以使功能更优雅,从而省略mymf可以定义为:

mf Nothing = Just . id
mf (Just x) = Just . f x

请注意,我们不能简单地将mf作为外部函数,因为它使用函数f,其参数为foldl1。所以我们把它放在where子句中:

foldl1 :: (a -> a -> a) -> t a -> a
foldl1 f xs = fromMaybe (errorWithoutStackTrace "foldl1: empty structure")
                (foldl mf Nothing xs)
    where mf Nothing = Just . id
          mf (Just x) = Just . f x

答案 2 :(得分:2)

在空列表案例中,foldl mf Nothing [] ~ Nothing按定义,foldl1将返回"empty structure"错误。

xs不为空时,foldl1'只是foldl的左侧折叠。在这种情况下,foldl的类型为

foldl :: (Maybe a -> a -> Maybe a) -> Maybe a -> [a] -> Maybe a

使用mf :: Maybe a -> a -> Maybe a子句中定义的组合函数where