gpt4 book ai didi

list - Haskell - 数字和列表

转载 作者:行者123 更新时间:2023-12-01 02:16:59 24 4
gpt4 key购买 nike

我写了以下代码:

class Number a where
compareN :: [a] -> [(String,String,Int)]

type Name = String
type Nr = Int
data N = Nums Name Nr

compareNum :: N -> N -> Int
compareNum (Nums a b) (Nums c d) = abs(b-d)

nameOfNum :: N -> String
nameOfNum (Nums a b) = a

instance Number N where
compareN [] = []
compareN [nr] = [(a,b,c) | a <- [nameOfNum nr], b <- [nameOfNum nr], c <- [compareNum nr nr]]

当我尝试运行时:

    compareN [(Nums "one" 1),(Nums "two" 2)]

我收到错误信息: * 异常:test.hs:(18,9)-(19,101):函数 compareN 中的非详尽模式

我想要得到的答案是这样的:

[("one","one",0),("one","two",1),("two","one",1),("two","two",0)]

我知道我必须再写一个模式:

compareN (nr:nrs) = [(a,b,c) | a <- [nameOfNum nr], b <- [nameOfNum nr], c <- [compareNum nr nr] : (compareN nrs)]

但它不工作..任何帮助请!谢谢

最佳答案

你使用模式匹配就好像你试图做一个手动递归,但在同一时刻你做了一个奇怪的列表理解。这是一种更清洁的方法。第一步生成两个数字的所有排列,第二步进行比较:

compareN xs = [(a,b,compareNum a b) | a <- xs, b <- xs]

语法 a <- xs, b <- xs意味着,输出包含所有可能的方式来获取 a和一个 b来自 xs ;这里不需要模式匹配。

关于list - Haskell - 数字和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com