管道符号之间的takeWhile参数 - |

时间:2015-05-04 02:12:05

标签: haskell pipe

takeWhile(或)dropWhile将谓词作为参数。 |Int x->Bool|问的第一个参数takeWhile是什么? pipe符号在haskell中的含义是什么?

foo := [1, 2, 3, 4, 5]
bar := foo.takeWhile |Int x->Bool| { return x < 3 }
// bar == [1, 2]
baz := foo.dropWhile |Int x->Bool| { return x < 3 }
// baz == [3, 4, 5]

1 个答案:

答案 0 :(得分:3)

直接翻译成Haskell看起来像这样:

module SO where

foo :: [Int]
foo = [1,2,3,4,5]

bar :: [Int]
bar = takeWhile (\x -> x < 3) foo

baz :: [Int]
baz = dropWhile (\x -> x < 3) foo

这是GHCi中的示例输出:

λ> foo
[1,2,3,4,5]
λ> bar
[1,2]
λ> baz
[3,4,5]

我猜|Int x -> Bool| { return x < 3 }是Fantom中lambda的语法 - 因此将谓词转换为Haskell只是

\x -> x < 3

正如您所看到的,Haskell不需要类型注释(管道 |之间的部分) - 它可以推断它。

确实你根本不需要这些类型 - 但通常你会给它们模块中的顶级构造。

它更通用

确实,虽然这只是Int列表,但Haskell可以使相同的代码适用于所有类型的数字。

当你在谓词中使用数字文字(3)和二元运算符<时,你需要两个约束:

  • Num了解您正在使用的号码
  • Ord代表<

GHCi会告诉你:

λ> :t (\x -> x < 3)
(\x -> x < 3) :: (Ord a, Num a) => a -> Bool

这就是为什么你也可以写更多的一般原因:

foo :: Num a => [a]
foo = [1,2,3,4,5]

bar :: (Num a, Ord a) => [a]
bar = takeWhile (\x -> x < 3) foo

baz :: (Num a, Ord a) => [a]
baz = dropWhile (\x -> x < 3) foo