谁能解释一下我该如何修复我的程序。
Haskell 的新手,一直在尝试创建一个 length
函数来计算任何类型列表的长度。
我的目标是使用 data
来做到这一点,因为我想创建一个全新的类型来做到这一点(这是我目前正在学习的 Haskell 领域,这就是为什么它可能不会是这个功能最有效的实现)
data List a = Nil | Cons a (List a)
len :: List a -> Int
len Nil = 0
len (Cons _ xs) = 1 + len xs
如果我在 len [1,2,3]
上运行它
我收到错误:
• Couldn't match expected type ‘List a0’
with actual type ‘[Integer]’
• In the first argument of ‘len’, namely ‘[1, 2, 3]’
In the expression: len [1, 2, 3]
In an equation for ‘it’: it = len [1, 2, 3]
最佳答案
函数定义是正确的,但是[1,2,3]
不是一个List a
对象,它是一个[a]
(或更规范的 [] a
)。像 [1,2,3]
作为 List Int
的列表是:
len <b>(Cons 1 (Cons 2 (Cons 3 Nil)))</b>
或者,您可以使 List a
成为 IsList
类型类的实例,然后使用 -XOverloadedLists
扩展:
{-# LANGUAGE <b>TypeFamilies</b> #-}
import GHC.Exts(IsList(Item, fromList, toList))
instance <b>IsList (List a)</b> where
type Item (List a) = a
fromList = foldr Cons Nil
toList Nil = []
toList (Cons x xs) = x : toList xs
然后我们可以使用OverloadedLists
扩展:
$ ghci -XOverloadedLists -XTypeFamilies
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/kommusoft/.ghci
Prelude> data List a = Nil | Cons a (List a)
Prelude> import GHC.Exts(IsList(Item, fromList, toList))
Prelude GHC.Exts> :{
Prelude GHC.Exts| instance IsList (List a) where
Prelude GHC.Exts| type Item (List a) = a
Prelude GHC.Exts| fromList = foldr Cons Nil
Prelude GHC.Exts| toList Nil = []
Prelude GHC.Exts| toList (Cons x xs) = x : toList xs
Prelude GHC.Exts| :}
Prelude GHC.Exts> :{
Prelude GHC.Exts| len :: List a -> Int
Prelude GHC.Exts| len Nil = 0
Prelude GHC.Exts| len (Cons _ xs) = 1 + len xs
Prelude GHC.Exts| :}
Prelude GHC.Exts> len [1,2,3]
3
关于list - 我对 Haskell 'length' 函数的重新定义不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60996276/