How do I create an operator in Haskell?

前端 未结 4 1534
栀梦
栀梦 2021-02-03 22:24

Making a ternary logic table, and I would like to make my own function for an operator that I\'ll call <=>.

So, for example, I want to do this, but

相关标签:
4条回答
  • 2021-02-03 22:32

    You can simplify (line-wise) the definition as follows:

    (<=>) :: Ternary -> Ternary -> Ternary
    T <=> T = T
    F <=> F = T
    M <=> M = T
    M <=> _ = M
    _ <=> M = M
    _ <=> _ = F
    
    0 讨论(0)
  • 2021-02-03 22:36

    Since you have Eq and Ord, you can do the following:

    data Ternary = T | F | M
    deriving (Eq, Show, Ord)
    
    (<=>) :: Ternary -> Ternary -> Ternary
    x <=> y = if x == y then T else max x y
    

    If you do happen to change it so that M <=> M == M, then you can do the following:

    data Ternary = M | T | F
    deriving (Eq, Show, Ord, Enum)
    
    (<=>) :: Ternary -> Ternary -> Ternary
    x <=> y = fromEnum $ rem (toEnum x * toEnum y) 3
    
    0 讨论(0)
  • 2021-02-03 22:39

    Function names with symbols have different syntax than those without:

    -- Works:
    (<^>) :: Int -> Int -> Int
    a <^> b = a + b
    
    -- Doesn't work:
    {-
    <^> :: Int -> Int -> Int
    <^> a b = a + b
    -}
    
    -- Works:
    letters :: Int -> Int -> Int
    letters a b = a + b
    
    -- Doesn't work:
    {-
    (letters) :: Int -> Int -> Int
    a letters b = a + b
    -}
    

    I promise, though - Haskell is well worth learning the complex rules.

    0 讨论(0)
  • 2021-02-03 22:42

    Just add parentheses around your operator:

    (<=>) :: Ternary -> Ternary -> Ternary
    (<=>) T F = F
    (<=>) T T = T
    (<=>) T M = M
    (<=>) F F = T
    (<=>) F T = F
    (<=>) F M = M
    (<=>) M F = M
    (<=>) M T = M
    (<=>) M M = T
    

    This turns it from infix form to prefix form. Alternatively, you can just use infix in the definition:

    (<=>) :: Ternary -> Ternary -> Ternary
    T <=> F = F
    T <=> T = T
    T <=> M = M
    F <=> F = T
    F <=> T = F
    F <=> M = M
    M <=> F = M
    M <=> T = M
    M <=> M = T
    
    0 讨论(0)
提交回复
热议问题