簡體   English   中英

或取兩個值 arguments 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 lxor [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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM