作者:mobiledu2502913437 | 来源:互联网 | 2023-05-21 19:46
这看起来很像一个家庭作业问题.如果是,我强烈建议您尝试自己回答这个问题.话虽如此,我将引导您完成如何制定这个问题的答案,并希望能够让您深入了解如何处理这样的问题.
我们知道mapNew
有类型a -> (a -> b -> c) -> [b] -> [c]
.这看起来很像现有的Prelude功能map :: (a -> b) -> [a] -> [b]
.所以我们可能想写下我们的答案map
.
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = ...
我们总是首先用它所引用的参数写出函数,以便我们可以看到我们必须使用的部分.知道,我们只有一个单一的a
,需要始终将它传递给f
每个元素b
中bs
,我们可以添加一个where
子句这部分应用程序:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = ...
where fa :: b -> c
fa = f a
鉴于此,我们现在可以写出我们的答案map
.
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = map fa bs
where fa :: b -> c
fa = f a
大多数haskell程序员会将此定义简化为:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = map (f a) bs
因为(f a)
它是部分应用的功能fa
.此外,我们可以将此表达式eta减少为:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f = map (f a)
这个答案的关键是"知道,我们只有一个语句a
,需要始终将它传递给f
每个元素b
的bs
".我怎么知道这个?
由于参数多态,我们无法检查任何类型的值a
.这意味着a
我们可用的唯一值类型是传递给的值mapNew
.此外,由于f
采用单个b
并生成单个c
,我们知道我们必须首先从b
提供的列表中获取一个以便应用f
它.这正是map
做,以及通过部分应用f
到a
我们得到我们想要传递给第一个参数map
.
1> acomar..:
这看起来很像一个家庭作业问题.如果是,我强烈建议您尝试自己回答这个问题.话虽如此,我将引导您完成如何制定这个问题的答案,并希望能够让您深入了解如何处理这样的问题.
我们知道mapNew
有类型a -> (a -> b -> c) -> [b] -> [c]
.这看起来很像现有的Prelude功能map :: (a -> b) -> [a] -> [b]
.所以我们可能想写下我们的答案map
.
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = ...
我们总是首先用它所引用的参数写出函数,以便我们可以看到我们必须使用的部分.知道,我们只有一个单一的a
,需要始终将它传递给f
每个元素b
中bs
,我们可以添加一个where
子句这部分应用程序:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = ...
where fa :: b -> c
fa = f a
鉴于此,我们现在可以写出我们的答案map
.
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = map fa bs
where fa :: b -> c
fa = f a
大多数haskell程序员会将此定义简化为:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f bs = map (f a) bs
因为(f a)
它是部分应用的功能fa
.此外,我们可以将此表达式eta减少为:
mapNew :: a -> (a -> b -> c) -> [b] -> [c]
mapNew a f = map (f a)
这个答案的关键是"知道,我们只有一个语句a
,需要始终将它传递给f
每个元素b
的bs
".我怎么知道这个?
由于参数多态,我们无法检查任何类型的值a
.这意味着a
我们可用的唯一值类型是传递给的值mapNew
.此外,由于f
采用单个b
并生成单个c
,我们知道我们必须首先从b
提供的列表中获取一个以便应用f
它.这正是map
做,以及通过部分应用f
到a
我们得到我们想要传递给第一个参数map
.