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

takeWhile arguments between pipe symbol - |

takeWhile(或)dropWhile 将谓词作为其参数。 takeWhile 问的第一个参数 |Int x->Bool| 是什么? 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]

直接翻译成 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 的语法 - 所以你的 predicate 到 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

还有。