我是功能编程的新手,所以如果有人能告诉我哪里错了,请写一个名为add.hs的文件我写道:
ha :: (Bool,Bool) -> (Bool,Bool)
ha (n,m) = ((n && m),((n || m) && not(n && m)))
fa :: (Bool,Bool,Bool) -> (Bool,Bool)
fa (a,b,r) = (c,s) where
(y,x) = ha(a,b)
(z,s) = ha(x,r)
c =(y||z)
(我知道可能有比Bool更合适的类型,但我只想测试它)
这是我加载文件时得到的: outupt
答案 0 :(得分:3)
这只是格式化和缩进:
ha :: (Bool, Bool) -> (Bool, Bool)
ha (n, m) = (n && m, (n || m) && not (n && m))
fa :: (Bool, Bool, Bool) -> (Bool, Bool)
fa (a,b,r) = (c,s)
where
(y,x) = ha (a, b)
(z,s) = ha (x, r)
c = y || z
除了我删除的无意义括号之外,您需要缩进where
子句,而不是写where
的列。这被称为越位规则,并在this answer中进行了解释。
另一方面,你并没有写出惯用的Haskell。我们通常会这样写ha
:
ha :: Bool -> Bool -> (Bool, Bool)
ha n m = (n && m, (n || m) && not (n && m))
并且fa
喜欢这样:
fa :: Bool -> Bool -> Bool -> (Bool, Bool)
fa a b r = (c, s)
where
(y,x) = ha a b
(z,s) = ha x r
c = y || z