function - 如何从类型签名中实现功能?
问题描述
我在 Haskell 中有以下两种类型签名:
foo :: (a -> (a,b)) -> a -> [b]
bar :: (a -> b) -> (a -> b -> c) -> a -> c
我想编写这两个函数的具体实现,但我真的很难理解从哪里开始。
我知道它foo
需要一个函数(a -> (a,b))
并返回a
一个包含b
.
并bar
接受一个函数,该函数(b -> c)
返回一个函数,该函数(a -> b -> c)
最终返回a
and c
。
谁能给我看一个具体实现的例子?
我怎么知道从哪里开始这样的事情以及定义左侧的内容?
解决方案
你有一些误解:
我知道它
foo
需要一个函数(a -> (a,b))
并返回a
一个包含b
.
不,它不会返回a
。除了该函数之外,它还期望它作为另一个参数。
并
bar
接受一个函数,该函数(b -> c)
返回一个函数,该函数(a -> b -> c)
最终返回a
andc
。
同样在这里。给定g :: a -> b
,bar
返回一个函数bar g :: (a -> b -> c) -> a -> c
。反过来,这个函数给定一个 function h :: (a -> b -> c)
,返回一个类型为 的函数a -> c
。就这样。
这就像玩拼图一样:
foo :: (a -> (a,b)) -> a -> [b]
-- g :: a -> (a,b)
-- x :: a
-- g x :: (a,b)
foo g x = [b] where
(a,b) = g x
bar :: (a -> b) -> (a -> b -> c) -> a -> c
-- g :: a -> b
-- x :: a
-- g x :: b
-- h :: a -> b -> c
-- h x :: b -> c
-- h x (g x) :: c
bar g h x = c where
c = ....
我们这里没有太多的自由选择。虽然,有更多的方法来获得更多的类型值b
,对于foo
。a
我们可以在(a,b) = g x
的更多应用中使用它,而不是忽略它g
,所以实际上还有更多的可能性,比如
foo2 :: (a -> (a,b)) -> a -> [b]
foo2 g x = [b1,b2] where
(a1,b1) = g x
(a2,b2) = g a1
还有很多。尽管如此,类型仍指导可能的实现。根据类型,foo
甚至可以在其实现中使用:foo
foo3 :: (a -> (a,b)) -> a -> [b]
foo3 g x = b : bs where
(a,b) = g x
bs = ...
所以现在,有了这个实现,前两个成为它的特例:foo g x === take 1 (foo3 g x)
和foo2 g x === take 2 (foo3 g x)
. 拥有最一般的定义可能是最好的。
推荐阅读
- python - LightGBM 返回负概率
- javascript - 通过AJAX插入html后在django视图中获取输入值
- angular - 默认设备后退按钮无法与选项卡一起正常工作:IONIC
- amazon-web-services - AWS S3 - 通过预签名 URL 放置文件时出现 400 错误请求
- asp.net - 如何在 ASP.NET CORE 3.1 过滤器中正确记录响应 http 代码?
- java - Anylogic:为每个资源使用单独的 RandomNumberGenerator
- java - 如何使用 TypedArray.getResourceId() 方法返回值?
- android - 如何在 Android 的 Recyclerview 的 onCreateViewHolder 中更改特定 LinearLayout 子项的颜色
- java - 当对象的所有字段都设置为默认值时,为什么实例常量有一个值?
- flutter - 如何使用 Shimmer 在 Flutter App 中添加 X 持续时间的延迟?