首页 > 解决方案 > Haskell 使用 map 调用具有多个参数的函数

问题描述

假设我们有以下代码表示二叉树,其中decodeInt在树中搜索整数:

import Text.Show.Functions
data BinTree a b = Leaf b | Node a (BinTree a b) (BinTree a b) deriving Show

example :: BinTree (Int -> Bool) Char
example = Node (\x -> x > 4) (Node (\x -> x * x == x) (Leaf 'g') (Node (\x -> x == 0)
          (Leaf 'u') (Leaf 'l'))) (Node (\x -> x >= 7) (Leaf 'f') (Leaf 'i'))

countInnerNodes :: BinTree a b -> Int
countInnerNodes (Node a b c) = 1 + countInnerNodes b + countInnerNodes c
countInnerNodes (Leaf x) = 0

decodeInt :: BinTree (Int -> Bool) b -> Int -> b
decodeInt (Leaf b) p = b
decodeInt (Node x y z) p = if (x(p) == True) then decodeInt z p else decodeInt y p

decode :: BinTree (Int -> Bool) b -> [Int] -> String
decode x [] = "empty list"
decode x xs = ??????

调用解码时如何使用地图获得这样的结果?

decode Tree [1,2,3,4] 
  = [decodeInt Tree (1), decodeInt Tree (2), 
     decodeInt Tree (3), decodeInt Tree (4)]

/edit: Followup 假设我们想创建一个函数,如下所示

mapTree (\x -> ’e’) example

mapTree 应该像示例一样返回 BinTree,唯一的区别是每个 Leaf 的 Char 已被替换为“e”。我该如何做到这一点?我昨天开始使用 Haskell,所以我对函数式编程很陌生。

标签: haskell

解决方案


decodeInt :: BinTree (Int -> Bool) b -> Int -> b, 所以假设t :: BinTree (Int -> Bool) b, 那么decodeInt t :: Int -> b. 您将该函数映射到您的Ints 列表上。

decode t xs = let y = map (decodeInt t) xs
              in ...

您仍然需要弄清楚如何转换为预期返回yString值。decode


推荐阅读