[英]Applying a filter function that takes two arguments to a list produced by a function that takes one argument in Haskell
[英]or takes two values arguments haskell
我是 haskell 的初學者,我試圖為埃拉托色尼篩法定義一個簡單的 function 但它說錯誤:
• Couldn't match expected type ‘Bool -> Bool’
with actual type ‘Bool’
• The function ‘or’ is applied to two value arguments,
but its type ‘t Bool -> Bool’ has only one
In the expression: or (mod n x) (divl l x)
In an equation for ‘divl’: divl (n : l) x = or (mod n x) (divl l x)
|
13 | divl (n:l) x = or (mod n x) (divl l x)
erat l [] = l
erat l (x:t) = if divl l x then erat l t else erat (x:t) l
divl (n:l) x = or (mod n x) (divl l x)
divl [] x = True
我試着把它寫成一個帶有“`”的運算符,但沒有任何效果
or
不是 boolean OR 運算符; 那是(||)
。 or
獲取 Boolean 個值的列表(嗯, Foldable
),如果至少有一個值為True
True
> or []
False
> or [True, False]
True
(請注意, or []
被定義為False
以保留身份or xs || or ys == or (xs ++ ys)
。作為一個具體示例, or [] || or [False] == or [False]
.)
嘗試使用(||):: Bool -> Bool -> Bool
而不是or:: Foldable t => t Bool -> Bool
https://hackage.haskell.org/package/base-4.17.0.0/docs/Prelude.html#v:-124--124-
https://hackage.haskell.org/package/base-4.17.0.0/docs/Prelude.html#v: 或
即mod nx || divl lx
mod nx || divl lx
或or [mod nx, divl lx]
。
您需要檢查模數是否為零,或者剩余的模數之一,您使用(||):: Bool -> Bool -> Bool
:
divl (n:l) x = mod n x == 0 || divl l x
divl [] x = False
basecase 應該是False
,否則它總是返回True
。 然而,與any
一起工作可能會更好:
divl ls x = any ((0 ==) . (`mod` x)) ls
最后總結我解決的答案
erat :: [Int] -> [Int] -> [Int]
erat l [] = l
erat l (x:t) = if divl l x then erat l t else erat (x:l) t
divl (n:l) x = ((mod x n) == 0) || (divl l x)
divl [] x = False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.