2 haskell algebraic-data-types
请考虑以下数据类型.
data Movement = Credit Float | Debit Float
deriving Show
Run Code Online (Sandbox Code Playgroud)
而现在这个功能.
retrieveBiggerThan :: [Movement] -> Float -> [Movement]
retrieveBiggerThan l k = (filter (\(Credit c) -> c>k) l) ++ (filter (\(Debit c) -> c>k) l)
Run Code Online (Sandbox Code Playgroud)
如果我测试这个,我收到输出"lambda中的非详尽模式":
retrieveBiggerThan [Credit 5.5, Debit 2.3, Credit 3.3] 2
[Credito 5.5*** Exception: ficha7.hs:116:35-53: Non-exhaustive patterns in lambda
Run Code Online (Sandbox Code Playgroud)
我相信这是因为过滤器只期望在其中定义的构造函数之一data Movement.有没有机会做这样的事情(一个过滤器能够在检查列表的同时考虑两个构造函数)?
filter (\((Credit c) || (Debit c)) -> c > k) listofmovements
Run Code Online (Sandbox Code Playgroud)
您可以使用LambdaCase扩展名使lambda更简洁:
{-# LANGUAGE LambdaCase #-}
data Movement = Credit Float | Debit Float
deriving Show
foo = map (\case { Credit f -> f; Debit d -> d}) [Credit 1, Debit 2]
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,您可以使用记录语法.
data Movement = Credit { value :: Float } | Debit { value :: Float }
retrieve l k = filter (\mvmt -> value mvmt > k) l
Run Code Online (Sandbox Code Playgroud)