如何在Haskell中使用具有数据类型的高阶函数

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)

Cha*_*ert 5

您可以使用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)


Dan*_*ner 5

在这种特定情况下,您可以使用记录语法.

data Movement = Credit { value :: Float } | Debit { value :: Float }
retrieve l k = filter (\mvmt -> value mvmt > k) l
Run Code Online (Sandbox Code Playgroud)