function - 如何从类型签名实现功能?

标签 function haskell types functional-programming implementation

我在 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) 最后返回 ac

谁能给我一个具体实现的例子?

我怎么知道从哪里开始这样的事情以及定义左侧的内容?

最佳答案

你的理解有误:

I understand that foo takes a function (a -> (a,b)) and returns a and a list containing b.

不,它不返回a。除了该函数之外,它还期望它作为另一个参数。

And bar takes a function (b -> c) which returns a function (a -> b -> c) which finally returns a and c.

这里也一样。给定 g::a -> bbar 返回函数 bar g::(a -> b -> c) -> a -> c。反过来,给定函数 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 = ....

我们在这里没有多少自由选择。虽然,对于 foo,有更多方法可以获取更多 b 类型的值。而不是忽略(a,b) = g x中的那个a,我们可以在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 )。拥有最一般的定义可能是最好的。

关于function - 如何从类型签名实现功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66091657/

相关文章:

perl - 已创建类型约束 'XYZ'

c++ - 如何将整个 char 数组及其值传递给另一个函数?

Haskell QuickCheck 为具有许多输入变量的函数生成随机数据

haskell - 内联函数仍然显示在 .prof 文件中

haskell - 从 Reader monad 中获取 Monadic 代码

c++ - result_of 无法推断出返回类型

c++ - 禁用 typedef 之间的隐式转换

不带括号的C函数调用

database - Magento 如何创建和保存产品?需要相同的文件和函数名称..?

javascript - 我应该将 jQuery 或 DOM 对象作为参数传递吗? (性能问题)